Spring 152

동적 프록시 기술

리플렉션 Java가 제공하는 JDK 동적 프록시, CGLIB같은 프록시 생성 오픈소스를 사용하면 프록시 객체를 동적으로 만들어낼 수 있다. 하나의 대상 클래스를 위해 프록시 클래스를 계속 만들지 않아도된다! 먼저 Java의 리플렉션에 대해 알아야하는데, 리플렉션을 사용하면 클래스나 메서드의 메타 정보를 동적으로 획득하고 코드도 동적으로 호출할 수 있다. 위와 같이 callA, callB 메서드를 가지고 있는 정적 클래스가 있다. 이 메서드를 호출하고 싶을 때 우리는 대부분 아래와 같이 코드를 짠다. 객체 생성 -> 호출 이 방식은 소스 코드에 명시적으로 작성되어있기 때문에 정적이라고 말할 수 있다. 이 자바 코드는 클래스 단위로 컴파일되어 바이트 코드가 되는데 이 바이크 코드를 조작하는 방법이 바로 리플..

프록시 패턴과 데코레이터 패턴

2021.11.01 - [Spring/Spring Core Advanced] - 템플릿 메서드 패턴과 콜백 패턴 템플릿 메서드 패턴과 콜백 패턴 2021.10.29 - [Spring/Spring Core Advanced] - ThreadLocal ThreadLocal 2021.10.28 - [Spring/Spring Core Advanced] - 로그 추적기 로그 추적기 애플리케이션이 커질수록 모니터링과 운영이 중요해진다. 어떤.. minchul-son.tistory.com 앞서 템플릿 메서드 패턴, 전략 패턴, 콜백 패턴을 로그 추적기에 적용시켜보며 공통의 변하지 않는 코드와 변하는 코드를 분리해 로직을 좀 더 간단하게 변경해보았다. 이 방법 또한 원본 코드에 코드 수정이 많이 필요하다. 기존 애플리케..

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

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와..

순수 JPA와 Querydsl

동적 쿼리와 성능 최적화 조회 - Builder 먼저 회원 정보와 소속 팀 정보를 담는 DTO를 생성하고 @QueryProjection을 통해 QType 클래스를 만들어주었다. 찾고자하는 회원에 대한 조건이 여기에 담겨서 넘어올 것이다. QType의 DTO가 생성되었기 때문에 위와같이 바로 DTO로 조회를 한다. Querydsl의 BooleanBuilder를 사용해 위와 같이 조건을 설정해주고 위와 같이 Repository의 코드를 구현하였다. 회원 이름과 팀 이름이 조건과 같은, 나이는 AgeGoe

Spring/Querydsl 2021.08.30

파일 업로드

일반적으로 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 예외 처리 최종적으로 알고 싶은 것은 스프링의 예외처리이지만, 서블릿 컨테이너위에서 스프링이 돌아가기 때문에 서블릿이 어떻게 예외처리를 하는지부터 알고가자. 스프링이 아닌 순수 Servlet 컨테이너는 예외를 어떻게 처리할까?? Serlet은 2가지 방식으로 예외 처리를 지원한다. - Exception(예외) - response.sendError(HTTP 상태 코드, 오류 메시지) 🔧 Exception 자바의 메인 메서드를 직접 실행하는 경우 main이라는 이름의 쓰레드가 실행되는데, 이 때 예외를 catch하지 못하고 main메서드를 넘어 예외가 throw되면 예외 정보를 남기고 해당 쓰레드는 종료된다. 웹 애플리케이션은 사용자 요청 별로 쓰레드가 할당되고, Servlet 컨테이너 안에서..

Spring/Spring MVC 2021.07.24
반응형