분류 전체보기

Backend

Spring + Swagger를 사용하여 API 문서화

1. 설정먼저, 개발하고 있는 프로젝트에 Swagger에 대한 의존성을 추가해준다.dependencies { implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0'} (스프링 시큐리티를 사용하고 있지 않다면, 넘겨도 된다.)만약, 스프링 시큐리티를 사용하고 있다면, 시큐리티에 Swagger 관련 경로를 추가해주어야 한다. .authorizeHttpRequests(request -> request .requestMatchers( "/", "/swagger-ui/**", "/v3/api-docs/**", "/swagger-ui.html" ).permitAll() ..

Backend/Spring Boot

Spring Boot #5. 자동 구성(Auto Config)

스프링 부트 - 핵심 원리와 활용의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 자동 구성(Auto Config) 스프링 부트가 제공하는 자동 구성(Auto Config)를 이해하기 위한 간단한 예제를 만들어보겠다. JdbcTemplate을 사용해 회원 데이터를 DB에 저장하고 조회하는 간단한 기능이다. 프로젝트 이름 : autoconfig 라이브러리 : Lombok, Spring Web, MySql Database, JDBC API Member memberId, name 필드가 있는 간단한 회원 객체이다. @Data public class Member { private String memberId; private String name; public ..

Backend/Spring - Core

Spring Advanced #13. 스프링 AOP 실무 주의사항

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 프록시와 내부 호출 스프링은 프록시 방식의 AOP를 사용한다. 따라서 AOP를 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 어드바이스를 호출하고, 이후에 대상 객체를 호출한다. 만약, 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 어드바이스도 호출되지 않는다. 스프링은 의존관계 주입시에 항상 프록시 객체를 주입하지만, 대상 객체의 내부에서 메소드 호출이 발생하면 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생한다. 프록시 방식의 AOP는 메서드 내부 호출에 프록시를 적용할 수..

Backend/Spring - Core

Spring Advanced #12. 스프링 AOP 실전

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 예제 생성 다음 어노테이션을 적용시킨 스프링 AOP를 만들어보겠다. @Trace : 어노테이션 로그 출력 @Retry : 어노테이션으로 예외 발생시 재시도 ExamRepository 5번정도 실행했을 때 1번 정도 오류가 발생하는 리포지토리이다. @Repository public class ExamRepository { private static int seq = 0; /** * 5번에 1번 실패하는 요청 */ public String save(String itemId) { seq++; if (seq % 5 == 0) { throw new IllegalStateException..

Backend/Spring - Core

Spring Advanced #11. 스프링 AOP 포인트컷

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 포인트컷 지시자 조인 포인트(Join Point)란 어드바이스(부가 기능)가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근, static 메소드 접근 같은 프로그램 실행 중의 지점이라고 정의했고, 포인트컷(Point Cut)이란 이 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능이라고 정의하였다. AspectJ는 포인트컷을 표현하기 위한 @Pointcut("execution(* hello.aop.order..*(..)") 와 같은 표현식을 지원한다. 포인트컷 표현식은 위 표현식에서 execute와 같은 포인트컷 지시자(PointCut Design..

Backend/Spring - Core

Spring Advanced #3. 템플릿 메소드 패턴과 콜백 패턴 (2)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 템플릿 콜백 패턴 변하는 부분과 변하지 않는 부분을 분리하는 것이 해결하고 싶은 문제였다. 변하지 않는 부분을 템플릿이라고 하고, 그 템플릿에 변하는 부분의 코드 조각을 넣어서 실행하는 것이 목적이다. 앞서 만들었던 ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백(Callback)이라 한다. 쉽게 이야기해서 콜백은 코드가 호출(call)은 되는데 코드를 넘겨준 곳(back)에서 실행된다는 뜻이다. 👉 콜백이란? 프로그래밍에서 콜..

Backend/Spring - Core

Spring Advanced #3. 템플릿 메소드 패턴과 콜백 패턴 (1)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 템플릿 메소드 패턴 로그 추적기 도입 전과 후의 코드를 비교해보자. 로그 추적기 도입 전 - V0 //OrderControllerV0 코드 @GetMapping("/v0/request") public String request(String itemId) { orderService.orderItem(itemId); return "ok"; } 로그 추적기 도입 후 - V3 //OrderControllerV3 코드 @GetMapping("/v3/request") public String request(String itemId) { TraceStatus status = null; tr..

Backend/Spring - Core

Spring Advanced #2. 쓰레드 로컬 - ThreadLocal

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 필드 동기화 앞서 로그 추적기를 만들어서 다음 로그를 출력할 때 트랜잭션ID와 level을 동기화 하는 문제를 해결하기 위해 TraceId를 파라미터로 넘겼다. TraceId를 파라미터로 넘기지 않기 위해 새로운 로그 추적기를 만들어보겠다. LogTrace 로그 추적기를 위한 최소한의 기능인 begin(), end(), exception()을 정의했다. public interface LogTrace { TraceStatus begin(String message); void end(TraceStatus status); void exception(TraceStatus status,..

Backend/Spring - Core

Spring Advanced #1. 로그 추적기 (2)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 로그 추적기 - V2 앞 Spring Advanced #1. 로그 추적기 (1) 에서 로그 추적기의 기능을 어느정도 개발했지만, 아직 메소드의 호출 깊이가 표현이 안되고, HTTP 요청이 구분이 안된다는 문제가 있다. 통틀어서 로그에 대한 문맥(Context) 정보가 필요하다. 로그 추적기 요구사항 모든 Public 메소드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 메소드 호출에 걸린 시간 정상 흐름과 예외 흐름, 예외 발생시 예외 정보가 남아야 한다. 메소드 호출 깊이 표현 HTTP 요청 구분 HTTP 요청 단위로 특정 ID를 남겨서 어떤 HTTP ..

Backend/Spring - Core

Spring Advanced #1. 로그 추적기 (1)

스프링 핵심 원리 - 고급편의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 프로젝트 생성 2. 예제 프로젝트 - V0 상품을 주문하는 프로세스라고 가정하고, 일반적인 웹 애플리케이션에서 Controller -> Service -> Repository 로 이어지는 흐름을 단순하게 만들어보겠다. OrderRepositoryV0 @Repository 어노테이션 안에는 @Component 어노테이션이 내장되어 있기 때문에, 의존관계 주입을 위해 따로 어노테이션을 선언할 필요가 없다. @Service, @Controller 도 마찬가지이다. @Repository @RequiredArgsConstructor public class OrderRepositoryV0..

DataBase/Spring - DB

Spring DB 2 #9. 스프링 트랜잭션 이해 (2)

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 스프링 AOP 주의 사항 - 초기화 시점 InitTest @PostConstruct 와 @Transactional 을 함께 사용하면 초기화 코드가 먼저 실행되고, 그 다음에 트랜잭션 AOP가 적용되기 때문에 초기화 시점에 아래 메소드에서는 트랜잭션이 적용되지 않는다. @PostConstruct @Transactional public void initV1() { boolean isActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("Hello init @PostConstr..

DataBase/Spring - DB

Spring DB 2 #9. 스프링 트랜잭션 이해 (1)

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 스프링 트랜잭션 복습 Spring DB #4. 스프링과 문제 해결 - 트랜잭션 (1), Spring DB #4. 스프링과 문제 해결 - 트랜잭션 (2)에서 배웠던 내용들을 더 자세히 살펴보는 글 입니다. PlatformTransactionManager : 스프링이 제공하는 트랜잭션 추상화 인터페이스 TransactionTemplate : 템플릿 콜백 패턴을 지원하는 클래스. 정상적으로 동작하면 커밋을 해주고, 오류가 생기면 롤백을 시켜준다. @Transactional : 스프링이 제공하는 트랜잭션 AOP 어노테이션, 프록시를 사용해서 프록시가 트랜잭션을 대신 처..

SeongJun Han
'분류 전체보기' 카테고리의 글 목록