본문 바로가기

Spring Boot

(12)
@Repository, @Service, DTO는 MVC 중 뭐지? @Repository, @Service, DTO는 MVC 중 어디에 속할까? 이를 살펴보기에 앞서 먼저 MVC에 대해 알아보자! MVC 1. Model Model은 비즈니스 로직을 처리한다. Model은 데이터를 처리한다 -> 데이터에 접근하고 조작하는 방법을 제공한다. 2. View View는 사용자에게 화면을 렌더링해주는 역할을 담당한다. Model의 데이터를 사용자에게 보기 쉽게 제공해준다. 3. Controller Controller는 요청에 따라 View와 Model로 명령을 적절히 분배해준다. Model을 통해 데이터를 조작하며, 렌더링할 View를 결정한다. 참고로 Controller는 View를 렌더링하지 않고, API로써 JSON이나 데이터를 반환할 수도 있다. 이런 경우, 반환값은 Mo..
log file 날짜별 rolling 설정 그동안 log file을 rolling 없이 관리했는데, 그냥 그러다가 문득 rolling 설정을 해야겠다는 생각이 들어서 해보았다. 나는 `xml`로 설정을 진행하였다. 1. `appender` 추가 logs/refill.log %d [%thread] %-5level %-50logger{40} - %msg%n logs/refill-%d{yyyy-MM-dd}.log 위와 같이 `appender`를 `configuration tag` 밑에 추가해줘야 한다. 기본적으로 하나의 파일에 모든 log가 저장된다. 그 하나의 파일명을 정해주는 게 `file tag`이다. `encoder`는 log 파일에 저장될 log들의 pattern을 지정해준다. `rollingPolicy`는 파일 rolling 설정에 관한 정..
API 예외처리 공통화 2 이번 글에서는 API 예외처리를 공통화해볼 것이다. 1. Global Exception 처리를 위한 class 생성 GlobalExceptionHandler package hello.hellospring.exception; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @Slf4j @Controlle..
API 예외처리 공통화 1 Spring Boot로 프로젝트를 만들다보면 API도 꽤 많이 작성하게 된다. (아님 말고,,,,,,) 이 API를 작성할 때 예외처리도 해야한다. ex) 회원가입 시 아이디나 전화번호 중복되는 경우, 상품주문 시 재고가 부족한 경우 등등 우리는 굉장히 많은 예외처리를 해야한다. 이 예외는 Service단에서 던지게 되고, 처리는 Controller단에서 하게 된다. 또한, 이러한 예외처리를 매번 반복하게 된다. 먼저 공통화하지 않는 경우, 예외처리를 살펴보자! 1. Error 처리를 위한 class 생성 ErrorMessage.java package hello.hellospring.exception; import lombok.AllArgsConstructor; @AllArgsConstructor pu..
Slack에서 error log 알림받기(console 변동 X) slack에서 프로젝트에 대한 error log 알림을 받기로 했다. 그러면 지금부터 어떻게 하는지 알아보도록 하자!! 1. webhook-uri 생성 1-1. slack app 좌측 메뉴 하단에서 '앱 추가' 버튼 클릭 1-2. incoming webhooks를 찾아서 추가 1-3. webhook을 추가할 채널 선택 1-4. webhook url을 복사한 후 가장 하단에 있는 설정 저장 버튼을 클릭하면 -끝- 이렇게 만든 webhook은 slack 사이트에서 확인가능합니다. 혹시라도 webhook URL을 복사하지 못했다면 아래 메뉴를 따라해주세요! > 관리(상단 메뉴바) - 사용자 지정 통합 앱(좌측 메뉴바) - incoming webhook - 구성 - 만들어놓은 webhook 관리 가능 2. ja..
@Transactional(readOnly = false)일 때 얻는 이점 @Transactional의 readOnly param을 false로 설정하면 다음과 같은 이점을 얻을 수 있다. 변경감지를 위해 snapshot(객체의 초기상태)을 저장해야 하는데, 이 동작을 하지 않아 메모리가 절약된다. 이는 @QueryHint를 이용하여 readOnly로 설정했을 때와 동일한 효과이다. (Spring 5.1부터 적용된다) FlushMode가 MANUAL로 설정되어, 직접 flush하지 않으면 flush가 일어나지 않게 된다. (Transaction commit이나 JPQL 실행 전과 같이 flush가 발생해야 하는 상황에서 발생하지 않는다.) (이 기능은 Hibernate의 전용기능이다.) @Test @Transactional(readOnly = true) public void r..
@Transactional method의 Transaction 전파 공부를 하다가 @Transactional method는 어떻게 전파되는지 궁금해졌다. 그리고 결국 정말 오랜 시간을 박치기해서 내가 원하는 결론에 다다를 수 있었다. 다음 결론들은 기본 전파 전략인 Required를 사용했을 때의 동작이다. 다른 전파 전략을 원하는 사람들은 공식문서를 참고해보자!. 결론은 다음과 같다. 맨 처음에 호출된 @Transactional method의 Transaction 설정이 그대로 다른 method들에게 전파된다는 것이다. (도대체 이 결론을 얻기 위해 얼마나 많이... 시도하고 찾아봤는지 모르겠다.) @Transactional method에서 Non-@Transactional method 호출 MemberJpaRepositoryTest.java package study...
SQL parameter 값 확인하기 JPA를 통해서 DB로 SQL을 전송하면 console에 parameter값이 ?로 찍히는 것을 볼 수 있다. 이 ?로 찍히는 parameter 값을 확인하는 2가지 방법을 알아보자! application.yml 설정 #생략 logging.level: org.hibernate.type: trace 위와 같이 logging.level.org.hibernate.type을 trace로 설정해주면 parameter가 console창에 찍히는 것을 볼 수 있다. console창 Hibernate: insert into member (username, id) values (?, ?) 2022-01-20 08:49:13.310 TRACE 40114 --- [ main] o.h.type.descriptor.sql.Ba..