Spring Boot 29

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

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

Spring Boot 2022.04.10

[SpringBoot] BcryptPasswordEncoder

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

Spring Boot 2022.04.03

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

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

Spring Boot 2022.04.02

[SpringBoot] OpenSessionInView

개요 JPA를 사용하는 서비스를 개발하는 도중 Controller에서 데이터를 변경했는데도 불구하고 DB에 변경이 되지 않는 문제가 발생했습니다. 검색해보니 이는 Transactional 범위 밖에서 데이터를 변경했기 때문에 발생했던 문제이고 자세한 내용을 알기 위해서는 OpenSessionInView(OSIV) 동작 원리를 알아야 한다고 해서 간단히 정리해보겠습니다. (OSIV는 hibernate에서 사용하는 용어이고 사실 JPA에서는 OpenEntityManagerInView(OEIV)라고 지칭합니다.) 내용을 잘 정리해주신 Shi._.D TIL님께 감사드립니다. * 해당 글은 JPA 영속성 컨텍스트에 대해 안다는 전제 하에 작성했습니다. https://jaimemin.tistory.com/1898 ..

Spring Boot 2022.03.29

[Spring Security] Remember-me를 통해 로그인 유지하기

개요 Spring Security를 통해 로그인한 뒤 브라우저 쿠키를 확인해보면 JSESSIONID가 있는 것을 확인할 수 있습니다. JSessionID는 Tomcat 컨테이너에서 세션을 유지하기 위해 발급한 키이며 HTTP 프로토콜은 기본적으로 stateless이기 때문에 상태를 저장하기 위해 Tomcat이 JSESSIONID 쿠키를 클라이언트에 발급한 것이며 해당 쿠키를 통해 세션을 유지합니다. 세션이 만료될 경우 쿠키 내 JSESSIONID가 사라지면서 로그인이 풀리게 되는데 세션이 만료되더라도 로그인을 유지하고 싶다면 Spring Security에서 제공해주는 Remember-me 쿠키를 사용해야 합니다. 이번 게시글에서는 Remember-me에 대해 간단하게 알아보겠습니다. * 쿠키, 세션에 대..

Spring Boot 2022.03.27

[Spring Security] @AuthenticationPrincipal

개요 로그인한 사용자의 정보를 매개변수로 전달받을 방법을 고민하던 중 편리하게 사용할 수 있는 어노테이션이 있어 간단히 정리하고자 합니다. 이 내용은 대부분 엔꾸꾸님이 정리하신 내용과 동일하므로 엔꾸꾸님 블로그를 참고하시는 것을 추천합니다. 1. @AuthenticationPrincipal 어노테이션 없이 로그인한 사용자의 정보를 불러오는 방법 해당 어노테이션을 사용하기 전에는 Principal 객체를 통해 로그인한 사용자를 받아올 수 있지만 이는 SecurityContextHolder 내 Principal(SecurityContextHolder.getContext().getAuthentication().getPrincipal())과는 달리 Java 표준 Principal 객체이므로 name 정보밖에 불..

Spring Boot 2022.03.26

[SpringBoot] AOP 간단 정리

개요 AOP(Aspect-Oriented Programming)은 IOC(Inversion Of Control), DI(Dependency Injection)와 함께 스프링 프레임워크의 핵심 요소로 거론됩니다. 이번 게시글에서는 AOP에 대해 간단히 알아보겠습니다. 본문을 읽기에 앞서 아래 게시글을 먼저 훑어보시는 것을 추천드립니다. https://jaimemin.tistory.com/2025 [디자인 패턴] JDK 동적 프록시와 CGLIB 개요 기존에 정리한 프록시 패턴(https://jaimemin.tistory.com/2016)을 통해 기존 코드를 변경하지 않고 부가적인 기능을 추가할 수 있는 장점이 있었지만 비슷한 구조를 갖는 프록시 클래스를 계속 생성 jaimemin.tistory.com htt..

Spring Boot 2022.01.12

[SpringBoot] @Aspect 어노테이션

개요 기존에 빈 후처리기에 대해서 알아봤으며 gradle 혹은 pom.xml에 'org.springframework.boot:spring-boot-starter-aop' 라이브러리를 추가하면 AnnotationAwareAspectJAutoProxyCreator라는 자동 프록시 생성기가 스프링 빈에 자동으로 등록이 된다는 것을 배웠습니다. (https://jaimemin.tistory.com/2028) 자동 프록시 생성기는 스프링 빈으로 등록된 Advisor들을 찾고, Pointcut에 매칭이 될 경우 자동으로 프록시를 적용해줍니다. @Aspect 어노테이션은 편리하게 Advisor 생성 기능을 지원하는데 이번 게시글에서는 @Aspect에 대해서 간단히 알아보겠습니다. 1. @Aspect 프록시 예시 @A..

Spring Boot 2021.12.23

[SpringBoot] 빈 후처리기 (BeanPostProcessor) 정리

개요 기존에 ProxyFactory에 대해 간단히 알아봤습니다. (https://jaimemin.tistory.com/2026) 이제 학습한 프록시를 컴포넌트 스캔한 빈에 적용하기 위해서는 실제 객체를 스프링 컨테이너에 빈으로 등록하지 않고 부가 기능이 적용된 프록시를 실제 객체 대신 스프링 컨테이너에 빈으로 등록해야 합니다. 이를 위해서 등장한 개념이 빈 후처리기이며 이번 게시글에서는 빈 후처리기와 스프링에서 제공하는 빈 후처리기에 대해 간단히 알아보겠습니다. 1. 빈 후처리기 빈 후처리기는 스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶을 때 사용하는 기능입니다. 빈 후처리기는 객체를 조작할 수도 있고, 완전히 다른 객체로 교체하는 것도 가능합니다. 빈 후..

Spring Boot 2021.12.21

[SpringBoot] ProxyFactory 정리 (feat. Advisor)

개요 저번 게시글에서 JDK 동적 프록시와 CGLIB(https://jaimemin.tistory.com/2025)에 대해서 정리했는데 요약을 하자면 인터페이스가 있는 경우에는 JDK 동적 프록시를 적용하고, 그렇지 않은 경우에는 CGLIB가 적용되는 것을 확인할 수 있었습니다. 보통 프로젝트를 개발할 때 인터페이스와 클래스를 혼용해서 사용하기 때문에 두 기술을 함께 사용하는데, 그렇다면 "부가기능을 제공하기 위해 JDK 동적 프록시가 제공하는 InvocationHandler와 CGLIB가 제공하는 MethodInterceptor를 중복으로 생성해서 관리해야 할까?"라는 의구심이 생겼습니다. 다행히도 스프링에서는 위와 같이 복잡한 방식 말고 동적 프록시를 통합해서 편리하게 생성해주는 ProxyFactor..

Spring Boot 2021.12.16