예제 프로젝트 생성
1. 컨트롤러
@RestController
- @Controller + @ResponseBody 합쳐진 것
- 컴포넌트 스캔과 스프링 Rest 컨트롤러로 인식됨
- RequestBody 와 ResponseBody 어노테이션
- JSON으로 요청한 파라미터들을 Java에서 받으려면 Java Object로의 변환이 필요함
- 응답시에도 Java Object에서 JSON으로 변환이 필요함
- @RequestBody 와 @ResponseBody 어노테이션이 이러한 작업들을 자동으로 처리
@RequestBody: HTTP 요청의 body 내용을 자바객체로 매핑하는 역할
@ResponseBody: 자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할
@RestController
@RequiredArgsConstructor
public class OrderControllerV0 {
private final OrderServiceV0 orderService;
@GetMapping("v0/request")
public String request(String itemId){
orderService.orderItem(itemId);
return "ok";
}
}
2. 서비스
@Service
- @Service 내부에 @Component 존재하여 컴포넌트 스캔 대상이 됨
- 스프링 빈으로 자동 등록됨
@RequiredArgsConstructor
- DI(의존성 주입)의 방법 중에 생성자 주입을 임의의 코드없이 자동으로 설정해주는 어노테이션
- 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성
@Service
@RequiredArgsConstructor
public class OrderServiceV0 {
private final OrderRepositoryV0 orderRepository; // 의존관계 주입
// RequiredArgsConstructor 어노테이션으로 인하여 생략 가능
/*
@Autowired
public OrderService(OrderRepositoryV0 orderRepository) {
this.orderRepository = orderRepository;
}
*/
public void orderItem(String itemId){
orderRepository.save(itemId);
}
}
3. 레포지토리
@Repository : 컴포넌트 스캔 대상이 됨 → 스프링 빈으로 자동 등록됨
@Repository
@RequiredArgsConstructor
public class OrderRepositoryV0 {
public void save(String itemId){
if(itemId.equals("ex")){ // 예외 상황 확인 : itemId가 ex인 경우 예외 발생
throw new IllegalStateException("예외 발생!");
}
sleep(1000); // 1초 지연 : 상품 저장하는데 약 1초 걸린다고 가정
}
private void sleep(int millis){
try {
Thread.sleep(millis);
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
4. 실행 및 결과
요구사항
로그 추적기 - 요구사항 분석
- 모든 Public 메서드의 호출과 응답 정보를 로그로 출력
- 애플리케이션 흐름을 변경하면 안됨 → 로그 남기기위해 비즈니스 로직 동작에 영향 주면 안됨
- 메서드 호출에 걸린 시간 출력
- 정상 흐름과 예외 흐름 구분 → 예외 발생시 예외 정보가 남아야 함
- 메서드 호출의 깊이 표현
- HTTP 요청을 구분
- HTTP 요청 단위로 특정 ID(트랜잭션 ID)를 남겨서 어떤 HTTP 요청에서 시작된 것인지 명확히 구분
- 트랜잭션ID : 하나의 http요청이 시작해서 끝날때 까지를 하나의 트랜잭션이라 함 (DB 트랜잭션과 무관)
예시
