Spring 71

[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

[SpringBoot] API 예외처리

개요 기존에 정리한 HTML 예외처리(https://jaimemin.tistory.com/1888)와 달리 API 예외처리는 고려해야 할 요소가 상당히 많습니다. HTML 예외처리 같은 경우 적절한 예외 페이지만 있으면 대부분의 문제를 해결할 수 있지만, API 예외처리 같은 경우 각 API마다 정해진 규약이 다르므로 각 에러 상황에 맞는 에러 응답 스펙을 정의해야 하고 JSON으로 데이터를 내려주어야 합니다. 이처럼 API마다 정해진 규약이 다르기 때문에 실무 개발을 진행하다 보면 각 프로젝트마다 API 규격 정의서를 작성해야 하는데, 규격도 양방향으로 합의한 후 정해야하기 때문에 해당 프로세스에 상당히 많은 시간을 투자해야 합니다. API 규격은 회사마다 상이하고 심지어 팀 마다도 다를 수 있으므로 ..

Spring 2021.08.08

[SpringBoot] HTML 예외처리와 예외 페이지

개요 실무 개발을 경험해보면 실제 개발하는 시간보다 예외처리 및 테스트 코드 작성하는데 시간이 더 많이 걸립니다. 따라서, 이번에는 예외처리와 예외 페이지에 대해 정리해보겠습니다. 1. 서블릿의 예외처리 과정 서블릿은 크게 두 가지 방식으로 예외처리 지원함 Exception을 던지거나 response.sendError(HTTP 상태 코드, 에러 메시지) 메서드 호출 1.1 Exception 자바의 메인 메서드를 직접 실행할 경우 main이라는 쓰레드가 실행되며 실행 도중 예외를 잡지 못하고 실행한 main() 메서드를 넘어서 예외가 던져지면, 예외 정보를 남기고 해당 쓰레드 종료 웹 애플리케이션의 경우 사용자 요청 별로 별도의 쓰레드가 할당되고, 서블릿 컨테이너 안에서 실행 애플리케이션에서 excepti..

Spring 2021.08.03

[SpringBoot] Filter, Interceptor 개념 정리 및 로그인 처리

개요 기존 게시글에서는 쿠키와 세션 개념을 정리하면서 이 두 개념을 이용하여 로그인 관련 코드 적용도 해봤습니다. (https://jaimemin.tistory.com/1885, https://jaimemin.tistory.com/1886) 하지만, 로그인 처리를 할 때 쿠키와 세션만으로는 해결 안 되는 점이 있습니다. 예를 들자면, 로그인을 해야지만 접근 가능한 페이지들이 있을 때 쿠키와 세션만 적용했을 때는 해당 페이지 url을 직접 쳐서 들어갈 경우 그대로 화면이 노출된다는 문제점이 있습니다. 사실 시스템 요구사항에서는 로그인하지 않은 상태에서 해당 페이지들에 접근할 경우 우선 로그인 페이지로 리다이렉트 한 후 다시 그 페이지로 리다이렉트 하는 방식을 원할 것입니다. 여기서 필터와 인터셉터가 쓰이는..

Spring 2021.08.01

[SpringBoot] 쿠키, 세션을 이용한 로그인 처리

개요 지난번 게시글에서는 쿠키, 세션, 그리고 쿠키와 세션을 이용한 로그인에 대한 개념을 정리해봤습니다. (https://jaimemin.tistory.com/1885) [SpringBoot] 쿠키, 세션 개념 정리 개요 이번 포스팅에서는 로그인 기능을 구현할 때 꼭 필요한 개념인 쿠키와 세션에 대해 정리해보겠습니다. 실제 로그인과 관련된 코드 및 설명은 다음 글에서 정리하겠습니다. 쿠키 서버에서 jaimemin.tistory.com 이번 게시글에서는 코드와 함께 지난번 게시글에 대한 부가 설명을 진행하겠습니다. 1. 쿠키를 이용한 로그인 처리 지난 게시글 복습 서버는 로그인 요청이 성공할 경우 응답 헤더 내 Set-Cookie 필드에 사용자 정보 전달 쿠키를 전달받은 클라이언트는 이후 모든 HTTP 요..

Spring 2021.07.31

[SpringBoot] 쿠키, 세션 개념 정리

개요 이번 포스팅에서는 로그인 기능을 구현할 때 꼭 필요한 개념인 쿠키와 세션에 대해 정리해보겠습니다. 실제 로그인과 관련된 코드 및 설명은 다음 글에서 정리하겠습니다. 쿠키 서버에서 요청에 대한 응답으로 클라이언트로 전달해주는 정보 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달하는 정보 위 두 정보는 HTTP Header에 저장이 됨 Set-Cookie: 서버에서 클라이언트로 쿠키 전달 Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청 시 서버로 전달하는 정보 쿠키 - 생명주기 Set-Cookie 내 expires라는 필드를 참고하면 쿠키 만료 날짜 및 시간을 알 수 있음 (GMT 기준) Set-Cookie 내 max-age 필드는 마지막 요청으로부터..

Spring 2021.07.29