Spring Basic part1~2 미션 피드백 정리

yshjft·2022년 4월 22일
0

exception

IOException

  • exception을 상속한다
  • checked exception이다. 따라서 반드시 try catchthrows 같은 명시적인 처리를 해주어야 한다.

RuntimeException

  • unchecked exception 이다. 따라서 명시적인 처리를 해주지 않아도 된다.

    메서드에서 예외 발생 → 예외 처리 안함 → 예외가 발생한 메서드를 호출한 메서드로 예외가 넘어감

  • ex) DataAccessException은 런타임 예외의 일종

  • 항상 custom exception은 RuntimeException 만을 상속하여 만들었다. 하지만 그럴 필요 없다. 상황에 맞는 exception을 사용하자!(ex. IllegalArgumentException 등)

  • 항상 RuntimeException을 상속한 CustomException이 있으면 throws를 추가하였다. 그럴 필요 없다.

왜 jar 파일에서 classpath가 문제가 될까?

  • jar로 실행시에는, IDE에서의 file 시스템과 경로가 다르다. 로컬 IDE 환경에서 file:// 로 시작되는 url을 사용하지만 Jar 실행 환경에서는 jar://로 시작되는 url을 사용한다.
  • 따라서 getFile이 아닌 inputStream을 이용해야 한다.

참고 자료

기타 피드백

클래스 네이밍

클래스는 단수형 명사로 이름을 짖자

Enum

Enum의 valueOf를 잘 사용하자. 모든 경우에서 추가 속성을 사용할 필요는 없다.

필요 없는 결합

public Console(VoucherService voucherService, CustomerService customerService) {
	this.voucherService = voucherService;
	this.customerService = customerService;
}

필요 없는 결합이었다. Console 클래스는 입출력을 목적으로 하는 클래스였기에 Voucher나 Customer의 역할을 가지고 있을 필요가 없었다. 따라서 입력에 따라 필요한 메서드를 수행시키는 Administrator라는 클래스를 생성하고 해당 클래스에 입출력 관련, Voucher 관련, Customer 관련 클래스들을 결합하였습니다.

service layer

  • public 메서드에서 다른 public 메서드를 호출하기 보다는 중복 되는 로직을 private으로 묶어라.
  • 서비스 안에서 다른 서비스를 사용하지 마라. 이는 설계를 다시 고려해봐야 할 것이다.

😣😣 @Transactional

현재 답을 완전히 못내린 문제이다. 일단 여기에 정리한 후 해결이 되면 수정하겠다.

@Transactional을 왜 사용할까?

어노테이션을 이용해 편리하게 트랜잭션을 관리하기 위해서 사용한다.(알아서 commit과 rollback을 처리)

문제1) 조회에서 @Transactional(readOnly = true) 사용

성능을 높일 수 있다고 해서(JPA의 경우 더티 채킹 안함 등)
→ 근데 이 기능은 JPA를 사용할 경우에만 의미가 있는 것일까?

문제2) CREATE, UPDATE, DELETE의 경우 @Transactional을 무조건 사용하였다.

→ 하지만 DML이 동시에 여러개 있는 경우(insert문이 2개)가 아니라면 @Transactional 어노테이션을 사용할 필요가 없지 않을까?

profile
꾸준히 나아가자 🐢

0개의 댓글