[24기_정홍준] spring tutorial 미션 제출합니다. - #1
Conversation
gilbert09031
left a comment
There was a problem hiding this comment.
1주차 과제 수고하셨습니다 !
예시 코드부터 선택과제까지 모두 꼼꼼히 작성해주셔서 읽어보면서 다시 복습할 수 있었던 것 같아요
특히 설계해가시면서 판단한 기준까지 남겨주신게 좋았던 것 같아요 !
앞으로도 화이팅 😄
| import jakarta.persistence.Id; | ||
| import lombok.Data; | ||
|
|
||
| @Data |
There was a problem hiding this comment.
@Data는 반복 코드를 줄여준다는 장점이 있지만, 내부적으로 여러 Lombok 어노테이션을 포함하고 있다는 것을 알고 계신가요~?
@Data가 대신 생성해주는 메서드가 어떤 문제를 만들 수 있을지 알아보면 좋을 것 같아요~
There was a problem hiding this comment.
첨부해주신 자료 참고하여 @Data가 어떠한 문제점을 발생시킬 수 있는지 알아보겠습니다! 리뷰 남겨주셔서 감사합니다!
| │ | ||
| └─→ View ──→ 응답(HTML) | ||
| ``` | ||
| 관심사를 분리하였습니다. 화면을 바꾸면 View만, 로직을 바꾸면 Controller와 그 아래만 건드립니다.<br> |
There was a problem hiding this comment.
MVC에서 화면 생성 로직을 View로 분리하는 부분을 보면서 실제 스프링 MVC에서는 view를 어떤 방식으로 만드는지도 같이 알아보면 좋을 것 같아요! JSP나 Thymeleaf 같은 템플릿 엔진과 Model, ViewResolver가 어떻게 연결되는지까지 찾아보면 좋을 것 같아요!
| -> CEOS Spring tutorial 과제를 진행하면서 api 호출을 할 때 엔드포인트가 /tests인 것을 /test로 잘못 쳐 | ||
| Whitelabel이 떴던 게 생각났고 그 원리에 대해 이번 기회로 알 수 있게 된 거 같습니다. | ||
|
|
||
| ### 어댑터는 왜 필요한가? |
There was a problem hiding this comment.
저도 HandlerAdapter가 DispatcherServlet 흐름에 존재한다는 것만 알고 있었는데 왜 필요한지까지 찾아보신 부분이 좋았습니다! 컨트롤러마다 호출 방식이 다르기 때문에 어댑터가 필요하다는 점을 이해하는데 도움이 됐어요!
rinarina0429
left a comment
There was a problem hiding this comment.
전체적으로 예시도 직관적이고, 설명이 너무 이해가 잘되고, 동시에 깊은 내용도 많아 도움이 많이 되었습니다. 한번 더 읽어봐야겠어요... 다음에 리뷰 차례 아니어도 구경 오겠습니다.. 수고하셨습니다!
| ### 프록시 때문에 생기는 함정 | ||
| ```java | ||
| @Service | ||
| public class TestService { | ||
|
|
||
| public void outer() { | ||
| inner(); // ← 여기가 문제 | ||
| } | ||
|
|
||
| @Transactional | ||
| public void inner() { | ||
| ... | ||
| } | ||
| } | ||
| ``` | ||
| `outer()`를 호출하면 `inner()`의 `@Transactional`이 동작하지 않습니다. 컨트롤러가 `outer()`를 부르면 프록시를 거칩니다. 하지만 | ||
| `outer()` 안에서 `inner()`를 부르는 건 `this.inner()`입니다. 이미 진짜 객체 안에 들어와 있으니 프록시를 다시 지나가지 않습니다. | ||
|
|
||
| 이걸 **자기 호출(self-invocation)문제**라고 하고, 실무에서 자주 발생합니다. 트랜잭션이 왜 안 걸리지 하고 한참 헤매게 되는 원인 1순위라고 볼 수 있습니다. | ||
| 해결책은 클래스를 분리하거나, 자기 자신을 주입받거나(`@Lazy` 필요), `AopContext`를 쓰는 방법이 있는데 보통은 클래스를 나누는 것이 정석입니다. |
There was a problem hiding this comment.
실무에서까지👍👍 고수같으십니다. AOP의 프록시 동작 방식뿐만 아니라 self-invocation 문제까지 정리해주셔서 이해하기 좋았습니다! 배워갑니다
| 이걸 **자기 호출(self-invocation)문제**라고 하고, 실무에서 자주 발생합니다. 트랜잭션이 왜 안 걸리지 하고 한참 헤매게 되는 원인 1순위라고 볼 수 있습니다. | ||
| 해결책은 클래스를 분리하거나, 자기 자신을 주입받거나(`@Lazy` 필요), `AopContext`를 쓰는 방법이 있는데 보통은 클래스를 나누는 것이 정석입니다. | ||
| ## 3. PSA | ||
| PSA는 Portable service Abstraction의 약자로 세 가지 중 제일 추상적이라 감이 잘 안 오는 개념입니다. |
No description provided.