Spring (183) 썸네일형 리스트형 [Core] 템플릿 콜백 패턴 이전 장(링크) 에서는 전략 패턴에 대해서 알아보았다. 이번 장에서는 템플릿 콜백 패턴에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 콜백 이전 장에서 전략 패턴을 살펴보면서 마지막 부분에서 전략인 Strategy를 Context의 파라미터로 전달하여 실행되도록 하였다. 이렇게 다른 코드의 파라미터로 넘기는 실행 가능한 코드를 콜백(callback)이라고 한다. 콜백 정의 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다. 위키백과 자바에서 실행 가능한 코드를 파라미터로 전달하려면 .. [Core] 전략 패턴 이전 장(링크) 에서 살펴본 템플릿 메서드 패턴에 이어 전략 패턴에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 전략 패턴(Strategy Pattern) 템플릿 메서드 패턴에서는 상위 클래스에 변화지 않는 기능(템플릿)을 만들고 자주 변하는 부로직은 하위 클래스에 만들고 상속을 사용하였다. 상속을 활용한 패턴이기 때문에 상속이 가지고 있는 단점을 그대로 가지게 되었다. 전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 이를 구현한 구현체에게 위임하는 방식이다. Context는 자주 변하지 않는 주로직(템플릿) 역할을 하고, Strategy는 자주 변하는 주로직(서비스 로직) 역할을 한다. 알고리즘 제품군을 정의하고 각각을.. [Core] 템플릿 메서드 패턴 이번 장부터는 템플릿 메서드 패턴을 시작으로 스프링이 많이 사용하거나 스프링을 사용하면서 많이 사용하게 되는 디자인 패턴에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 정의 템플릿 메서드 패턴의 목적은 다음과 같다. 작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있다. 상위 클래스에서 자주 변경되지 않는 템플릿을 정의하고 자주 변경되는 로직은 하위 클래스에서 정의하는 것이다. 이러한 방식으로 설계하면 하위 클래스가 전체 구조를 변경하지 않고, 필요한 특정 부분만 재정의할 수 있다. 상속과 오버라이딩을 통한 다형성을 활용한 디자인 패턴이다. 좋은 설계 일반.. [Core] ThreadLocal 이전 장(링크) 에서는 필드 동기화를 도입하면서 다중 스레드가 경합하는 경우에 동시성 문제가 발생하는 것을 확인하였다. 이번 장에서는 동시성 문제를 해결하기 위한 방법 중 하나인 ThreadLocal에 대해서 알아보도록 한다. 모든 코드는 깃허브(링크) 에 올려두었다. ThreadLocal ThreadLocal은 해당 스레드만 접근할 수 있는 저장소를 의미하며 스레드 관점에서는 프라이빗 저장소가 된다. 일반 변수 필드에 값을 저장하면 아래의 이미지처럼 모든 스레드가 공유하게 된다. ThreadLocal을 사용하면 각 스레드마다 별도의 저장소를 사용하기 때문에 다중 스레드가 같은 인스턴스의 ThreadLocal 필드에 접근하여도 동시성 문제가 발생하지 않는다. ThreadLocal 예제 이전 장에서 사용한.. [Core] 필드 동기화와 동시성 문제 이전 장(링크) 에서는 서비스의 로그를 출력하는 방법에 대해서 알아보았다. 이번 장에서는 이전 장에서 발생한 문제를 해결하기 위해 필드 동기화를 도입하고 동시성 문제에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 개요 이전 장에서는 요청에 대한 트랜잭션 아이디를 로그에 출력하기 위해 파라미터로 TraceId를 넘겼다. 하지만 로그를 위한 트랜잭션 아이디는 서비스 로직과는 무관하기 때문에 서비스 로직을 위한 메서드의 파라미터로 전달하는 것은 AOP 관점에서 잘못된 방식이다. 이번 장에서는 주로직(서비스 로직)과 부로직(로그를 출력하는 로직)을 분리하기 위해 필드 동기화를 도입해본다. 구현 LogTrace 로그를 출력하기 위한 기능 명세를 가지고 있는 LogTrace 추상 클래스를 생성한다... [Core] 서비스 로그 이번 장에서는 APM 툴의 힘을 빌리지 않고 직접 서비스 로그를 출력하는 기능을 구현하는 방법에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 개요 시중에 많은 APM 툴을 사용하면 아래와 같이 하나의 요청(트랜잭션)이 들어오고 나가는 모든 과정을 기록해준다. 네이버 Pinpoint 이번 장에서는 이러한 APM 툴의 도움없이 마치 툴이 만들어주는 것과 같은 기능을 만들어본다. 우리가 기능을 구현하고 나면 아래와 같이 요청이 들어오고 나갈 때까지의 과정이 출력되어야 한다. [2fa0a4b2] OrderController.request() [2fa0a4b2] |--> OrderService.orderItem() [2fa0a4b2] | |--> OrderRepository.save() [2fa0.. [Spring MVC] 파일 업로드 이번 장에서는 서블릿과 스프링의 파일 업로드 기능에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. 파일 업로드 HTML Form 전송 방식은 아래와 같은 두 가지 방식이 있다. application/x-www-form-urlencoded multipart/form-data application/x-www-form-urlencoded application/x-www-form-urlencoded은 가장 기본적으로 HTML 폼 데이터를 서버로 전송하기 위해 사용되는 방법이다. Form 태그에 별도의 enctype 옵션이 없으면 브라우저는 요청 HTTP 메시지의 헤더에 컨텐츠 타입(Content-Type: application/x-www-form-urlencoded)을 추가한다. HTML 폼에 입.. [Spring MVC] Formatter 이전 장(링크) 에서는 데이터의 타입을 변경시켜주는 타입 컨버터에 대해서 알아보았다. 이번 장에서는 컨버터의 특별한 버전인 포맷터(Formatter)에 대해서 알아본다. 모든 코드는 깃허브(링크) 에 올려두었다. Formatter 이전 장에서 알아본 Converter의 경우 입출력 타입에 제한이 없이 사용되는 범용적인 기능이었다. 경우에 따라서 입출력값이 모든 형식을 지원해야 하는 것이 아니라 일정 타입으로 한정되는 경우가 많다. 예를 들어 숫자를 문자로 출력하는 경우 1000 -> "1,000"과 같이 일반 숫자를 돈을 표시하는 형식으로 변경될 수 있다. 문자를 날짜로 변경하는 경우도 "2022-06-03 14:00:00"과 같은 문자열을 날짜로 포맷으로 변경되어야 한다. 예를 들어 살펴본 돈과 시간의.. 이전 1 2 3 4 5 6 7 ··· 23 다음