Spring 112

Spring의 프록시 기술

JDK 동적 프록시는 인터페이스가 있는 경우에만 사용이 가능하고, CGLIB은 구현체에도 적용이 가능하다. 이 두가지를 일관성있게 사용할 수는 없을까? Spring은 동적 프록시를 통합하여 편리하게 만들어주는 ProxyFactory를 제공한다! ProxyFactory는 인터페이스가 있다면 JDK 동적 프록시를 사용하고, 구체 클래스만 있다면 CGLIB을 사용한다. 물론 이 기본설정을 변경할 수도 있다! ProxyFactory Proxy에 추가할 부가 기능을 적용하기위해 Advice를 만들어주면된다. 이 Advice는 JDK 동적프록시의 InvocationHandler, CGLIB의 MethodInterceptor가 호출한다. Advice는 프록시에 적용할 부가 기능 로직이다. InvocationHandl..

@ModelAttribute와 @RequestBody 그리고 Setter

@RequestBody와 Setter 본 주제에 대해 이야기하기 전에 먼저 @ModelAttribute에 대해 이야기해보려합니다. @ModelAttribute 우리는 Spring에서 Reqeust Parameter를 얻기 위해 @ModelAttribute를 사용하곤합니다. 값을 바인딩하여 우리가 원하는 객체로 변환해주는 역할을 하는데 아래와 같이 형식에 맞춰 값이 넘어오면 원하는 객체로 손쉽게 변환할 수 있다는 큰 장점이 있습니다. 물론 타입이나 형식이 안맞으면 TypeConverter에서 예외가 발생함 값을 바인딩하길 원하는 객체인 RequestDto는 name과 age필드 두가지를 가지고 있는데 실제 요청을 postman을 사용해 html-form 형식으로 전달해보겠습니다.(query paramete..

Spring 2021.11.24

템플릿 메서드 패턴과 콜백 패턴

2021.10.29 - [Spring/Spring Core Advanced] - ThreadLocal ThreadLocal 2021.10.28 - [Spring/Spring Core Advanced] - 로그 추적기 로그 추적기 애플리케이션이 커질수록 모니터링과 운영이 중요해진다. 어떤 부분에서 병목현상이 발생하는지 어떤 부분에서 예외가 발생하는지 minchul-son.tistory.com 앞서 ThreadLocal을 통해 로그 추적기를 개발하고 애플리케이션에 적용시켜보았다. 컨트롤러의 핵심 기능은 서비스를 호출하는 것이다. 하지만 로그 추적기를 적용시키면서 로그를 출력하는 부가 기능 코드가 추가되면서 코드가 복잡해졌다. 핵심 기능과 부가 기능을 더 효율적으로 변경할 수는 없을까? 핵심 기능 핵심 기능은..

ThreadLocal

2021.10.28 - [Spring/Spring Core Advanced] - 로그 추적기 로그 추적기 애플리케이션이 커질수록 모니터링과 운영이 중요해진다. 어떤 부분에서 병목현상이 발생하는지 어떤 부분에서 예외가 발생하는지를 로그로 확인하는 것은 매우 중요하다. 아래와 같은 요구사 minchul-son.tistory.com 위 글에서 만든 로그 추적기는 파라미터로 트랜잭션 상태를 넘기며 동기화를 하였다. 하지만 이 방식은 모든 메서드에 파라미터를 추가해야하는 등 몇가지 문제가 존재했는데 파라미터를 넘기지 않도록 만들어 이 문제를 해결할 수 있는 방식에 대해 알아보자. 필드 동기화 파라미터를 넘기지 않고 필드를 동기화할 수 있는 방법에 대해 알아보자. 먼저 LogTrace의 인터페이스를 구현한다. be..

로그 추적기

애플리케이션이 커질수록 모니터링과 운영이 중요해진다. 어떤 부분에서 병목현상이 발생하는지 어떤 부분에서 예외가 발생하는지를 로그로 확인하는 것은 매우 중요하다. 아래와 같은 요구사항을 가정한다. 모든 Public 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 비즈니스 로직에 영향 X 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 예외 발생시 예외 정보 메서드 호출의 깊이 표현 HTTP 요청을 구분 HTTP 요청 단위로 특정 ID를 남겨 어떤 HTTP 요청에서 시작된 것인지를 구분 가능 트랜잭션 ID ==> HTTP 트랜잭션을 의미 로그 추적기 Version 0 트랜잭션의 깊이를 로그로 남기기 위해서는 이전의 정보를 이어받아 로그로 출력해야한다. 먼저, 트랜잭션 ID와..

파일 업로드

일반적으로 HTML Form을 통해 파일 업로드 기능을 구현한다. 먼저 HTML Form 전송 방식 두 가지를 알아보자. - application/x-www-form-urlencoded - multipart/form-data application/x-www-form-urlencoded 이 방식은 HTML Form을 서버로 전송하는 가장 기본적인 방법이다. 별도의 "enctype"옵션이 없으면 웹 브라우저는 요청 HTTP 헤더에 아래와 같이 추가한다. Content-Type : application/x-www-form-urlencoded Form에 입력한 데이터를 HTTP Body에 문자로 &로 구분하여 전송하게된다. 파일 업로드를 위해서는 파일은 문자가 아니라 바이너리 데이터를 전송해야하는데 문자를 전송..

Spring/Spring MVC 2021.08.12

Spring Type Converter

문자를 숫자로 변환하거나 숫자를 문자로 변환해야하는 것과 같은 타입을 변환하는 경우가 많다. 예를 들면 아래와 같다. 위와 같이 쿼리스트링으로 넘어온 파라미터를 받고 싶다. 이를 위해 "/hello-v1?data=5"라는 요청을 보내면 getParameter를 통해 값을 받을 수 있다. 하지만 이는 숫자타입가 아니라 문자타입이다(String). 따라서 직접 Integer타입으로 변환하는 과정을 거쳐야한다. 하지만 무의식 중에 우리가 아무렇지 않게 사용하던 @RequestParam을 떠올려보자. @RequestParam Integer data 이와 같이 별도의 타입 변환과정 없이 손쉽게 개발자가 원하는 타입으로 변환된다. 이는 스프링이 중간에서 타입을 변환해주기 때문이다! 이러한 역할을 하는 것이 바로 T..

Spring/Spring MVC 2021.08.03

API 예외 처리

HTML 페이지의 경우에는 4xx, 5xx.html과 같은 오류 페이지만 있으면 대부분의 문제를 해결할 수 있지만, API의 경우에는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야한다. 어떻게 이를 처리할 수 있을까? 먼저 처음으로 돌아가 Servlet 오류 페이지 방식을 사용해보자. api를 처리하는 컨트롤러를 만들고 내부에 static 클래스로 memberDto를 만들어 진행하겠다.(실제 작업시에는 별도로 생성해야함) @RestController이기 때문에 id가 ex가 아니라면 json형식으로 응답이 반환될 것이고 ex라면 RuntimeException이 발생해 오류 페이지를 내부적으로 호출해 반환될 것이다. 먼저 정상 요청이다. 다음으로 런타임에러를 발생시켜본다...

Spring/Spring MVC 2021.07.28

필터, 인터셉터

필터는 Servlet이 제공하는 기능이고, 인터셉터는 Spring이 제공하는 기능이다. 요구사항 : 로그인한 사용자만 상품 관리 페이지로 접속할 수 있어야한다. 단순히 상품 관리 컨트롤러에서 로그인 여부를 체크하는 로직을 추가하면 되겠지만 등록/수정/삭제/조회 등 모든 컨트롤러에 추가하는 것은 매우 비효율적이다. 또한 향후에 로직이 변경될 때마다 모든 로직을 다시 수정해야한다. 이렇게 애플리케이션 여러 로직에서 공통으로 관심이 있는 것을 공통 관심사(Cross-Cutting Concern)라고 한다. 공통 관심사는 스프링의 AOP로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 Servlet의 필터나 Spring의 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리하기 위해서는 HTTP H..

Spring/Spring MVC 2021.07.21

쿠키, 세션

참고 : 패키지 구조 설계 도메인이 가장 중요하다.(도메인 : 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야하는 핵심 비즈니스 영역) domain-webweb을 다른 기술로 바꾸어도 domain은 그대로 유지될 수 있도록 설계해야한다.즉, web은 domain을 알지만 domain은 web을 모르도록..(web을 모두 삭제해도 domain에는 영향이 가지 않게)의존관계는 단방향으로 흐르게 하는 것이 좋다. 2021.07.17 - [Spring] - 패키지 구조 설계 1. 회원 가입 들어온 Form 데이터를 검증하고, Repository에 save를 진행하는 단순한 구조이다. 2. 로그인 파라미터로 들어온 로그인id로 Member 객체를 조회하고 조회된 객체의 password와 파라미터..

Spring/Spring MVC 2021.07.17
반응형