메이쁘

[Spring] 예상 Q&A 공부(Entity @Setter 지양 이유, @ControllerAdvice 관련) 본문

면접 대비 CS지식/SELF CS면접 Q&A

[Spring] 예상 Q&A 공부(Entity @Setter 지양 이유, @ControllerAdvice 관련)

메이쁘 2021. 12. 28. 00:31

안녕하세요.

 

CS관련 질문과 면접에 맞는 답변을 작성하면서 지식도 쌓고 면접도 대비하는 시간을 가지려고 합니다.

 

 

틈틈히 게시글을 작성하며 면접 대비 데이터셋을 확보해둔 다음

 

언젠간 면접하게 될 때 모아서 쓰려고 합니다.

 

(실제로 면접에서 들었던 질문이 아니라, 제가 스스로 답을 정해놓고 짜논 질문이라 이렇게 안나올 수 있습니다!!!)

 

 

 

이번 글은 Spring 카테고리 입니다.

 

 

 

 

  -- 질문 목록

 

Q1.  JPA Entity Class에서 @Setter를 지양하는 이유는? (Entity에서 Setter 함수를 사용하지 않는 이유?)

Q2.  @ControllerAdvice 어노테이션의 정의 및 사용 목적, 사용한 이유는? 

Q3.  @ExceptionHandler 어노테이션의 정의와 사용 방법?

Q4.  그 외의 @ModelAttribute나 @InitBinder 에 활용하는 방법은?


Q1.  JPA Entity Class에서 @Setter를 지양하는 이유는? (Entity에서 Setter 함수를 사용하지 않는 이유?)

 

A. 가장 큰 이유는 어떤 포인트에서든지 Setter 함수 호출을 통해 Entity의 값을 변경할 수 있다면, DB 데이터 값 변경에 대한 히스토리를 코드를 보고 파악하기 어려워집니다.

즉, Entity의 값을 변경한 의도를 파악하기 어려운 단점이 있습니다. 마찬가지로, Entity 객체 값의 일관성을 보장하기 어려워집니다.

 

그렇기 때문에, 의도를 파악할 수 있는 함수를 내부에 따로 만들어 이를 사용하여 값을 변경합니다. 

그러면 함수 이름만으로 어떤 목적으로 Entity의 값을 변경하는지 빠르게 파악할 수 있습니다.

 

 

 

Q2.  @ControllerAdvice 어노테이션의 정의 및 사용 목적, 사용한 이유는?

 

A. AOP를 활용해 Exception Handler를 커스터마이징 해서 모든 컨트롤러에서 Exception Handling을 하기 위해 사용했습니다.

 

@ControllerAdvice 어노테이션은 모든 컨트롤러에 AOP(Advice)를 적용시키는 기능을 합니다. 즉, 모든 컨트롤러에 @ControllerAdvice 어노테이션이 붙은 Bean이 추가되서, 해당 Bean을 무조건 실행하게 됩니다. 그렇기 때문에 AOP 타겟 범위를 별도로 지정할 수 있습니다. (PointCut)

 

@RestControllerAdvice 어노테이션은 @Controller와 @ResponseBody가 결합된 어노테이션으로, Body 값을 포함해 REST 통신하는 곳에 사용됩니다. 이는 @ControllerAdvice를 포함하고 있습니다.

 

이러한 @ControllerAdvice는 보통 @ExceptionHandler 를 함께 활용해 예외 처리 핸들링을 커스텀할 때 사용하지만, 이 외에도 @ModelAttribute와 @InitBinder에도 사용합니다.

 

 

 

Q3.  @ExceptionHandler 어노테이션의 정의와 사용 방법?

 

A. @ExceptionHandler 뒤에 Exception(RuntimeException을 상속받은 Class도 가능) Class 이름을 설정할 수 있는데, 이렇게 되면 컨트롤러 뿐 아니라 서비스 등 Bean 객체들에서 발생한 Exception을 여기서 catch해서 처리할 수 있습니다.

 

이를 통해, Exception 처리를 비즈니스 로직마다 포함시키지 않고 분리함으로써 좀 더 비즈니스 로직에만 집중할 수 있습니다.

 

만약, 이 것이 없다면 각각의 Bean마다 Exception 발생할 때, 그 지점에서 catch해서 처리하거나 throw해서 상위로 전달해야하는데, 중복 코드도 많아지고 관리 포인트도 많아지게 됩니다.

 

 

 

Q4.  그 외의 @ModelAttribute나 @InitBinder 에 활용하는 방법은?

 

A. @ModelAttribute를 사용할 경우, 컨트롤러의 메소드마다 공통적으로 사용할 객체가 있을 때 @ModelAttribute를 활용한 함수의 리턴 값을 Model 객체에 담아놓게 됩니다. 이는 Spring Security를 사용할 때 사용자의 정보를 불러오는 경우에도 활용할 수 있습니다.

이는 메소드의 인자로 Model을 불러와 add하는 방법과 값을 리턴해서 Model에 적용하는 방법이 있습니다.

 

@InitBinder는 Model 데이터 검증과 바인딩에 사용됩니다.

 

 

 

 

이상입니다.

 

감사합니다.

Comments