Spring 46

@Transactional 동작 원리

용어 정리 트랜잭션 관리에는 크게 두 가지 방법이 있습니다. 선언 방식의 트랜잭션 관리 프로그래밍 방식의 트랜잭션 관리 선언적 트랜잭션 관리 @Transactional 애노테이션 하나만 선언해서 편리하게 트랜잭션을 적용하는 방법 "트랜잭션을 적용하겠다"라고 메서드나 서비스에 선언하기만 하면 AOP를 통해 트랜잭션이 적용되는 방식 프로그래밍 방식의 트랜잭션 관리 PlatformTransactionManager 또는 TransactionTemplate 등을 통해 트랜잭션 관련 코드를 직접 작성하는 방법 이번 게시글에서는 선언적 트랜잭션 관리의 동작 원리에 대해 알아보겠습니다. Transaction AOP 전체 흐름 @Transactional 애노테이션이 선언되면 AOP를 통해 트랜잭션이 적용되므로 Trans..

Spring 2023.03.29

Springboot 동작 방식 및 분석하는 방법

개요 Spring Initialzr가 제공해 주는 프로젝트 템플릿 덕분에 개발자들은 손쉽게 스프링 부트 프로젝트 개발을 시작할 수 있습니다. 버튼 몇 번 클릭만 하면 개발을 바로 진행할 수 있기 때문에 편리하다는 장점이 있지만, 이로 인해 저를 포함해서 많은 개발자들이 스프링 부트의 내부 동작 과정 및 AutoConfiguration에 의해 추가된 빈들을 배우지 않는 단점이 있습니다. 따라서, 이번 게시글에서는 스프링 부트가 내부적으로 구성 정보를 어떻게 추가하는지 살펴보고 추가된 bean들에 대해 확인하는 방법을 간략하게 소개하겠습니다. 글을 읽기에 앞서 아래 게시글들을 참고하시면 이해가 더 잘 될 것 같습니다. https://jaimemin.tistory.com/2259 [Spring Boot] Au..

Spring 2023.03.15

[Spring] @Conditional 정리

개요 스프링 4.0부터 추가된 Conditional 애노테이션에 대해 간단히 정리해 보겠습니다. @Conditional & Condition 인터페이스 앞서 언급했듯이 @Conditional은 Spring 4.0부터 추가가 되었고 이름 뜻대로 모든 조건을 충족해야지만 스프링 컨테이너에 Bean으로 등록시키는 역할을 수행합니다. @Conditional은 @Configuration 클래스와 @Bean 메서드에 적용이 가능하기 때문에 Target이 타입과 메서드 모두 적용되며 클래스 조건을 만족하지 못하는 경우 메서드는 무시가 됩니다. 스프링 부트가 사용하는 @Conditional의 가장 대표적인 방법은 클래스의 존재를 확인할 때이며 이를 위해 @ConditionalOnClass와 @ConditionalOnM..

Spring 2023.03.07

[Spring Boot] AutoConfiguration

개요 스프링 부트의 Bean 구성 정보는 Component Scan에 의해서 등록되는 Bean과 AutoConfiguration에 의해 자동으로 등록되는 빈으로 구분됩니다. 이번 게시글에서는 일반적으로 자동으로 등록되는 빈과 함께 AutoConfiguration의 동작 메커니즘에 대해 작성해 보겠습니다. Bean의 역할과 구분 AutoConfiguration 동작 메커니즘에 대해 알아보기 전에 앞서 Bean의 정의와 함께 역할과 구분에 대해 알아야 합니다. Bean이란 스프링 컨테이너에서 생성되고 관리되는 자바 객체이며 모두 싱글톤으로 관리됩니다. Bean은 크게 3가지로 구분할 수 있는데 아래와 같습니다. Application Logic Bean Application Infrastructure Bean..

Spring 2023.03.06

[Spring Boot] 메타 애노테이션과 합성 애노테이션

개요 스프링 부트에는 annotation 관련 기능을 많이 제공하고 있는데 저 포함 많은 개발자가 동작 방식을 자세히 모르는 상태로 개발을 하고 있는 것 같습니다. 스프링에서 기본으로 제공하는 애노테이션 같은 경우 동작 원리를 모르는 상태로 사용해도 개발하는데 문제없지만 커스텀하게 애노테이션을 선언해야 할 경우 문제가 발생할 확률이 큽니다. 따라서 이번 게시글에서는 간략하게 스프링에서 제공하는 메타 애노테이션과 더불어 합성 애노테이션에 대해 알아보겠습니다. 메타 애노테이션(Meta-annotation) 메타 애노테이션은 애노테이션에 적용한 애노테이션을 의미합니다. 예를 들자면, @Controller 애노테이션이 부여된 클래스는 @Controller의 메타 애노테이션인 @Component가 직접 사용된 것..

Spring 2023.03.06

Spring 지원 없이 Servlet을 통해 Front Controller 구현

개요 앞서 작성한 Spring Boot 개요 게시글에서 스프링 부트는 스프링 애플리케이션 개발에 요구되는 Servlet Container의 설치, WAR 폴더 구조, web.xml, WAR 빌드, 컨테이너로 배치, 포트 바인딩, 클래스로더, 로깅 등과 같은 필요하지만 애플리케이션 개발의 핵심이 아닌 단순 반복 작업을 제거해 주는 개발 도구와 아키텍처를 지원한다고 언급했습니다. https://jaimemin.tistory.com/2254

Spring 2023.03.02

Spring Boot 개요

개요 그동안 많은 스프링 부트 프로젝트를 진행했지만 부끄럽게도 스프링과 스프링 부트의 차이점을 완벽히 이해하지 못한 채 개발을 진행했습니다. 저는 단순하게 "스프링 부트는 내장 톰캣 서버를 가지고 있는 스프링"이라고 생각했는데 토비님의 인프런 강의 초반부를 듣자마자 큰 착각이었다는 것을 깨달았습니다. 따라서 이번 게시글에서는 둘의 차이점을 명확하게 파악하기 위해 스프링 부트에 대해 정리해보겠습니다. 스프링 부트 Spring Boot는 스프링을 기반으로 실무 환경에 사용 가능한 수준의 독립실행형(stand-alone) 애플리케이션을 별다른 고민 없이 빠르게 개발할 수 있도록 도와주는 여러 가지 도구의 모음입니다. 스프링에서는 제공하는 선택지가 많고 스프링과 함께 사용하는 다양한 기술 및 라이브러리를 개발자..

Spring 2023.02.27

[SpringBoot] 구글 SMTP 통해 메일 보내기

개요 회원 가입 이후 이메일 인증을 한 사용자에게만 서비스 접근을 할 수 있도록 구현하고 싶어 찾아본 결과 구글에서 제공하는 SMTP 서비스를 통해 비교적 쉽게 구현할 수 있었습니다. 단, 구글 SMTP 서비스는 한 이메일 당 하루 100건씩 제한을 걸기 때문에 로컬에서 여러 번 테스트하고 싶을 때는 실제 메일을 보내지 않고 콘솔에 메일 내용을 로그로 작성하는 것을 추천드립니다. 이번 게시글에서는 구글 SMTP 설정과 메일 보내는 방법 그리고 콘솔에 메일 내용을 로그로 작성하는 방법을 간단히 공유해보겠습니다. 1. 구글 계정 앱 비밀번호 설정 및 application.properties 설정 구글 SMTP를 사용하기 위해서는 구글 계정 내 앱 비밀번호를 설정해야 합니다. https://support.go..

Spring 2022.04.10

[SpringBoot] BcryptPasswordEncoder

개요 실제 서비스를 개발해 본 경험이 있는 개발자라면 사용자의 비밀번호를 DB에 평문으로 저장하면 절대 안 된다는 것을 알 것입니다. 그 이유는 보통 사람들은 여러 사이트에 동일한 아이디와 비밀번호를 사용하는데 혹여나 DB가 해킹당했을 경우 해커가 평문으로 저장된 아이디와 비밀번호를 통해 여러 사이트를 동시에 접속할 가능성이 있기 때문입니다. 이 때문에 비밀번호는 항상 암호화를 한 뒤 저장해줘야하는데 이번 게시글에서는 해싱 즉, 단방향 암호화 기능을 제공하는 BcryptPasswordEncoder에 대해 간단히 알아보고 단방향 암호화에 대해서도 간단하게 알아보겠습니다. 좋은 글을 작성하고 공유해주신 Stranger's LAB님과 Kim VamPa님께 감사드립니다. 1. BcryptPasswordEncod..

Spring 2022.04.03

[SpringBoot] 로그인된 사용자가 접근할 수 있는 기능 Test 작성하는 방법

개요 로그인된 사용자를 대상으로 하는 Controller 테스트를 작성할 때 저는 @BeforeEach 어노테이션을 통해 form 로그인을 먼저 진행하고 @WithUserDetails의 setUpBefore를 TEST_EXECUTION으로 설정하여 @BeforeEach 어노테이션이 호출된 뒤 테스트를 진행하도록 구현했습니다. 하지만, 테스트는 제가 원했던 순서와 달리 @WithUserDetails 어노테이션이 붙어있는 테스트가 @BeforeEach가 먼저 실행되어 에러가 발생했습니다. 찾아본 결과 이는 JUnit5 Spring Security 버그이며 현재 2022.04.02 기준으로도 아직 해결이 되지 않은 상태입니다. 따라서, 저는 커스텀 어노테이션과 @WithSecurityContext 어노테이션 ..

Spring 2022.04.02