- Today
- Yesterday
- Total
메이쁘
[Spring] 예상 Q&A 공부(Entity @Setter 지양 이유, @ControllerAdvice 관련) 본문
[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 데이터 검증과 바인딩에 사용됩니다.
이상입니다.
감사합니다.
'면접 대비 CS지식 > SELF CS면접 Q&A' 카테고리의 다른 글
[Spring] 예상 Q&A 공부(PUT과 PATCH 차이, JPA 연관관계, MapStruct와 ModelMapper) (0) | 2022.01.05 |
---|---|
[Spring] 예상 Q&A 공부(EntityManager, 영속성 컨텍스트, @Transactional readOnly) (0) | 2021.12.29 |
[Spring] 예상 Q&A 공부(Transactional 트랜잭션 적용 범위) (5) | 2021.12.26 |
[WEB] 예상 Q&A 공부(HTTP Status Code, Web과 WAS의 차이) (0) | 2021.03.02 |
[Android] 2021.01.28. 오늘의 면접 Q&A (0) | 2021.01.28 |