spring boot 15

HttpMessageConverter 우선순위(feat. AWS S3)

최근 회사에서 특정 API에 Spring Interceptor를 통해 HTTP Request를 JSON으로 파싱하고 S3에 업로드하는 로직을 수정하는 작업을 진행했다. 로직의 흐름은 간단하다. Interceptor의 afterCompletion 메서드에서 요청이 성공했냐 실패했냐에 따라 다른 S3 경로에 업로드하기만 한다. 물론, 우리는 모든 요청은 JSON으로 반환될 것임을 기대하였고 ObjectMapper를 통해 RequestBody를 JSON으로 변환하는 로직을 내부에 추가하였다. JSON으로 값이 반환될 수 있도록 @RequestMapping(value = "/something", produces = {MediaType.APPLICATION_JSON_VALUE}) produce를 통해 반환될 값을..

Spring 2023.10.31

yml에서 List Object 사용법

yml에서 변수를 리스트 형식으로 사용하는 법 로컬환경, 개발환경, 상용환경으로 환경을 분리할 때, yml에 변수를 넣어두고 코드에서 불러와 사용하는 방법을 흔히 사용하곤 한다. person: name: '민철' 이런 방식으로 말이다. 사용하는 쪽에서는 아래와 같다. @Value("${person.name:}) private String name; 추가적으로 yml은 List나 Map과 같은 다양한 데이터 유형을 지원하고 있다. programming: language: - C - Java - Python - JavaScript 이를 가져오려면 @Value("${programming.language[0]:}") private String language; // C @Value("${programming.l..

Spring 2022.04.29

Spring Kafka를 사용해 Slack에 메시지 보내기

🚀 들어가며 입사 후, 첫 업무로 Spring과 Kafka를 연동하고 특정 이벤트에 따라 Slack에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다. 나는 이번 계기로 Kafka를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다. ⚙️ 환경 java 17 Spring Boot 2.6.4 Spring Web Spring Kafka lombok jackson ✨ Slack Incoming Webhooks 먼저, 슬랙에 메시지를 보내기 위해 Incoming Webhooks라는 슬랙 앱을 사용하였다. 메시지를 전송할 채널의 세부정보로 들어가 앱 추가를 클릭한다. Incoming Webhooks을 슬랙 채널에 설치하면 아..

Spring/Spring Kafka 2022.03.23

빈 후처리기

빈 후처리기란?(BeanPostProcessor) @Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다. 그 이후에는 등록된 빈을 조회하고 사용할 수 있게된다. 스프링이 빈 저장소에 등록할 목적으로 객체를 생성하는데(Singleton) 등록 직전에 조작하고 싶을 때 사용하는 것이 바로 빈 후처리기!! 즉, 빈을 생성한 후에 무언가를 처리하는 용도로 이해하자! 빈 후처리기 기능 객체를 조작 다른 객체로 바꿔치기 빈 후처리기 과정 생성 : 스프링 빈 대상이 되는 객체를 생성 전달 : 생성된 객체를 빈 후처리기에 전달 후 처리 작업 : 빈 후처리기가 스프링 빈 객체를 조작 등록 : 스프링 컨테이너의 내부 저장소에 빈 객체 등록 Bean..

Spring의 프록시 기술

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

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

예외 처리, 오류 페이지

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

Spring/Spring MVC 2021.07.24

쿠키, 세션

참고 : 패키지 구조 설계 도메인이 가장 중요하다.(도메인 : 화면, 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

Bean Validation

대부분의 특정 필드에 대한 검증 로직은 일반적인 로직이고 공통적이다. 이런 검증 로직을 모든 프로젝트에 적용하도록 공통화, 표준화한것이 바로 Bean Validation!! public class Item { private Long id; @NotBlank private String itemName; @NotNull @Range(min = 1000, max = 1000000) private Integer price; @NotNull @Max(9999) private Integer quantity; } Bean Validation이 뭔데? Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준. 검증 애노테이션과 여러 인터페이스의 모음. 이..

Spring/Spring MVC 2021.07.14
반응형