Spring 71

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

[SpringBoot] OpenSessionInView

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

Spring 2022.03.29

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

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

[Spring Security] @AuthenticationPrincipal

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

[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 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 2021.12.23