Spring 46

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

[Spring Security] @AuthenticationPrincipal

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

Spring 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 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

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

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

Spring 2021.12.21

[SpringBoot] ProxyFactory 정리 (feat. Advisor)

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

Spring 2021.12.16

[SpringBoot] ThreadLocal 간단 정리

개요 스프링 프레임워크 내 Bean들은 스프링 컨테이너에 의해 싱글톤으로 관리됩니다. 정리하자면 인스턴스가 단 하나만 존재한다는 것인데 여러 쓰레드가 동시에 해당 인스턴스를 접근할 경우 동시성 이슈가 발생할 가능성이 높습니다. 또한, static 같은 공용 필드에도 위와 동일한 문제가 발생할 수 있는데 이를 해결해주기 위해 Java에는 ThreadLocal이라는 객체가 존재합니다. 이번 게시글에서는 ThreadLocal에 대해서 간단하게 정리해보겠습니다. ThreadLocal ThreadLocal은 Thread만 접근할 수 있는 특별한 저장소 여러 쓰레드가 접근하더라도 ThreadLocal은 Thread들을 식별해서 각각의 Thread 저장소를 구분 따라서 같은 인스턴스의 ThreadLocal 필드에 여..

Spring 2021.11.13

[SpringBoot] 파일 업로드 및 다운로드

개요 파일 업로드와 다운로드는 웹 애플리케이션에서 자주 쓰이는 기능입니다. 최근에 엑셀 다운로드 기능을 개발하면서 파일 다운로드 기능은 구현(https://jaimemin.tistory.com/1889)을 해봤는데 아직 파일 업로드 기능은 실무 프로젝트에 적용해본 적이 없으므로 이번 기회에 파일 업로드에 대해 정리해보겠습니다. 1. HTML 폼 전송 방식 HTML 폼 전송 방식에는 아래와 같이 크게 두 방식이 있습니다. application/x-www-form-urlencoded multipart/form-data 1.1 application/x-www-form-urlencoded 기존 게시글(https://jaimemin.tistory.com/1805) HTML Form - POST 방식을 참고하시면 ..

Spring 2021.08.14

[SpringBoot] 스프링 TypeConverter 정리

개요 컨트롤러에서 @RequestParam 어노테이션이나 @ModelAttribute 어노테이션을 붙이면 String 자료형이 다른 제네릭 타입으로 자동 형 변환되는 것을 확인할 수 있습니다. 이는 스프링에서 기본으로 제공해주는 TypeConverter 덕분인데 이번 게시글에서는 TypeConverter에 대해 알아보겠습니다. 1. 스프링 타입 컨버터 HTTP 요청 파라미터는 모두 문자열로 처리 따라서, 요청 파라미터를 다른 제너릭 타입으로 변환하기 위해서는 변환하는 과정을 거쳐야 함 개요에서도 언급했듯이 @RequestParam, @ModelAttribute, @PathVariable 같은 어노테이션이 해당 과정을 대신해주기도 함 그 외 TypeConverter 적용 예시 @Value 어노테이션을 통해..

Spring 2021.08.11