일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Spring Boot
- 백준
- JDBC
- http
- db
- 김영한
- Proxy
- Exception
- Android
- spring
- springdatajpa
- 스프링 핵심 기능
- java
- 그리디
- 자바
- jpa
- 스프링
- 인프런
- Thymeleaf
- transaction
- SpringBoot
- Servlet
- Greedy
- AOP
- kotlin
- JPQL
- 스프링 핵심 원리
- QueryDSL
- pointcut
- 알고리즘
- Today
- Total
목록인프런 (528)
개발자되기 프로젝트
트랜잭션ID와 메서드 호출의 깊이를 표현하는 하는 가장 단순한 방법은 첫 로그에서 사용한 트랜잭션ID 와 level 을 다음 로그에 넘겨주면 된다. 현재 로그의 상태 정보인 트랜잭션ID 와 level 은 TraceId 에 포함되어 있다. 따라서 TraceId 를 다음 로그에 넘겨주면 된다. 1. OrderControllerV2 기존 begin()외에 동기화기능이 추가된 beginSync()를 추가해주자. 간단하게 이전의 TraceId를 받아와서 createNextId()를 호출해준다. /** * v2에서 추가 */ public TraceStatus beginSync(TraceId beforeTraceId, String message){ //TraceId traceId = new TraceId(); Tra..
앞서 만든 로그추적기를 적용해보자. 1. OrderControllerV1 앞의 테스트 처럼 단순하게 trace.begin(), trace.end()로 끝나는 것이 아니라 예외 처리를 위해 try-catch 구문을 사용한다. 예외가 발생해도 로그를 남길 수 있어야 한다. 이 때 예외 상황에서 로그를 남기기 위해 프로그램 흐름을 변경해서는 안된다. 즉, 예외를 먹어버리지 말고 다시 던져줘야 한다. @RestController //@Controller +@ResponseBody @RequiredArgsConstructor public class OrderControllerV1 { private final OrderServiceV1 orderService; private final HelloTraceV1 tra..
애플리케이션의 모든 로직에 직접 로그를 남겨도 되지만, 그것보다는 더 효율적인 개발 방법이 필요하다. 특히 트랜잭션ID와 깊이를 표현하는 방법은 기존 정보를 이어 받아야 하기 때문에 단순히 로그만 남긴다고 해결할 수 있는 것은 아니다. 요구사항에 맞추어 애플리케이션에 효과적으로 로그를 남기기 위한 로그 추적기를 개발해보자. 먼저 프로토타입 버전을 개발해보자. 아마 코드를 모두 작성하고 테스트 코드까지 실행해보아야 어떤 것을 하는지 감이 올 것이다. 먼저 로그 추적기를 위한 기반 데이터를 가지고 있는 TraceId , TraceStatus 클래스를 만들어보자. 1. TraceId 로그 추적기는 트랜잭션ID와 깊이를 표현하는 방법이 필요하다. 트랜잭션ID와 깊이를 표현하는 level을 묶어서 TraceId ..
1. 로그 추적기를 만들어 보자. 애플리케이션이 커지면서 점점 모니터링과 운영이 중요해지는 단계라고 가정. 특히 최근 자주 병목이 발생하고있다고 해보자. 어떤 부분에서 병목이 발생하는지, 그리고 어떤 부분에서 예외가 발생하는지를 로그를 통해 확인하는 것이 점점 중요할 것이다. 기존에는 개발자가 문제가 발생한 다음에 관련 부분을 어렵게 찾아서 로그를 하나하나 직접 만들어서 남겼는데 이 부분을 개선하고 자동화 해보자. 2. 요구사항 모든 PUBLIC 메서드의 호출과 응답 정보를 로그로 출력 애플리케이션의 흐름을 변경하면 안됨 로그를 남긴다고 해서 비즈니스 로직의 동작에 영향을 주면 안됨 메서드 호출에 걸린 시간 정상 흐름과 예외 흐름 구분 예외 발생시 예외 정보가 남아야 함 메서드 호출의 깊이 표현 HTTP..
상품을 주문하는 프로세스로 가정, 일반적인 웹 애플리케이션에서 Controller -> Service -> Repository로 이어지는 흐름을 최대한 단순하게 만들어 보자. 1. Repository @Repository @RequiredArgsConstructor public class OrderRepositoryV0 { public void save(String itemId){ if (itemId.equals("ex")){ throw new IllegalStateException("예외 발생"); } sleep(1000); } private void sleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) { e...
1. 요구사항 요구사항 상품을 관리 상품 이름 첨부파일 하나 이미지 파일 여러개 첨부파일을 업로드 다운로드 할 수 있다. 업로드한 이미지를 웹 브라우저에서 확인할 수 있다. 2. Item 상품 도메인 import lombok.Data; import java.util.List; @Data public class Item { private Long id; private String itemName; private UploadFile attachFile; private List imageFiles; } 3. itemRepository @Repository public class ItemRepository { private final Map store = new HashMap(); private long seq..
스프링은 MultipartFile 이라는 인터페이스로 멀티파트 파일을 지원 1. SpringUploadController @Controller @Slf4j @RequestMapping("/spring") public class SpringUploadController { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile(){ return "upload-form"; } @PostMapping("/upload") public String saveFile(@RequestParam String itemName, @RequestParam MultipartFile file, HttpServletReque..
1. 파일 저장 경로 지정. 서블릿이 제공하는 Part 에 대해 알아보고 실제 파일도 서버에 업로드 해보자. 먼저 파일을 업로드를 하려면 실제 파일이 저장되는 경로가 필요하다. application.properties : 경로 끝에 / 추가 필요. file.dir=C:/Users/계정/..../file/ 2. Controller @Slf4j @Controller @RequestMapping("/servlet/v2") public class ServletUploadControllerV2 { @Value("${file.dir}") private String fileDir; @GetMapping("/upload") public String newFile(){ return "upload-form"; } @Pos..