Spring @OneToOne은 LazyLoading이 안되는데 @OneToMany는 왜 될까 2022. 5. 9. @OneToOne 연관관계 주인인 경우 조회할 때 참조하는 컬럼을 보고 값이 있으면 프록시 객체, 없으면 null 할당 실제 조회할 때 쿼리쏴서 프록시 객체에 가져오기 주인이 아닌 경우 (양방향) 프록시 객체 or null을 넣어줄 판단 기준이 없음(table에 참조 컬럼이 없기 때문) 그래서 optional = false면 LazyLoading가능(다른 조건도 있긴함) 무조건 프록시 객체로 넣을 경우, 값이 없을 때 값이 없다는걸 나타낼 방법이 없음 @OneToMany는 왜 LazyLoading 가능?? @OneToMany인 경우는 연관관계에 주인이 아닌 경우밖에 없는데 왜 가능하지? 무조건 프록시 객체를 넣어주면 되기 때문에 LazyLoading 가능 OneToOne인 경우엔 무조건 프록시 객체를 넣.. Restdocs 빌드파일 위치 못찾는 에러, Unresolved directive in 2021. 11. 1. Restdocs로 문서를 만들고 베타 배포를 했는데, 배포만 하면 귀신같이 아래와 같은 에러가 문서를 뒤덮었다. Unresolved directive in test.adoc - include::{snippets}/api-controller-rest-docs-test/test_채널_변경_불가/response-fields.adoc[] ... 실제론 jenkins/~~ 로 시작하는 경로를 못 찾는다고 나와 있었다. local에서는 html문서도 잘 만들고 api 스펙도 잘 나왔는데 배포만 하면 안 나오니 삽질 시간이 길어졌다. 결국 답답해서 에러가 난 경로를 뚫어지게 쳐다보다가 그 원인을 파악할 수 있었다. 내가 만든 테스트 메소드 명은 아래와 같은 형태였다. void TEST_채널_변경_불가() { ... .. STS Maven java.lang.ClassNotFoundException 2021. 3. 17. 학교 강의때문에 오랜만에 STS로 spring-boot project를 만들어보았는데 시작하자마자 java.lang.ClassNotFoundException 이 계속 발생했다. 검색해서 나오는 해결 방법을 전부 시도해봤는데 안됐다. STS를 몇년만에 켜본지 10분도 안돼서 intellij를 더욱 찬양하게 되는.. 그런 시간이었다. 결국에 해결했는데 다음에 STS를 사용할때도 겪을만한 Exception 같아서 블로그에 기록해둔다. 해결 방법이 간단해서 글로 적기도 뭐하지만 spring-boot 버전을 내려서 해결하였다. STS에서 Spring Starter Project로 boot project를 만들면 boot 버전이 default로 2.4.3으로 되어있는데 이 버전을 maven에서 2.4.0 으로 내려.. Objects.isNull과 Validation 2020. 11. 20. javable에서 댓글을 보면서 배운 내용 중에 기억이 흐려져서 자꾸 다시 찾아보게 하는 댓글들이 있다. 다시 찾는 게 번거로워서 확실히 기억하기 위해.. 혹은 다시 찾을 때 편하게 찾기 위해 글로 정리해놓고자 한다. Objects.isNull, Objects.nonNull javable에 아래와 비슷한 예제를 작성한 글이 있었다. public void validateEmpty(List names) { if (Objects.isNull(names)) { throw new IllegalArgumentException(ERROR_MESSAGE); } ... } 위 코드는 메서드로 넘어온 List names를 null 체크하는 평범한 코드로 보일 수 있지만 좋은 코드는 아니다. Objects.isNull 메서.. HttpMessageNotReadableException, LocalDateTime 2020. 11. 18. 컨트롤러 단위 테스트를 완벽하게 짰다고 생각했는데 자꾸 HttpMessageNotReadableException가 발생했다. 분명 저번에 같은 문제를 해결했었는데.. 낚시로 물고기를 많이잡다보니 뇌가 물고기화 되가는 것 같다. 이번에 기록하고 기억해야겠다. 문제가 발생했던 상황을 최대한 간단하게 코드로 작성하면 아래와 같다. @Test void changeOrderStatus() throws Exception{ Order order = createOrderWithOrderStatus(OrderStatus.MEAL); String content = new ObjectMapper().writeValueAsString(order); mockMvc.perform(put("/api/orders/{orderId}/.. DDD에서는 왜 간접 참조를 더 권장할까? 2020. 10. 10. spring-pet-clinic-data-jdbc를 살펴보다 객체간의 연관 관계가 전부 간접 참조로 되어있어서 왜 그런지 알아보았다. DDD를 제대로 이해하지는 못했지만 DDD에서는 간접 참조를 권장한다. 그 이유에 대해서도 알아봤는데 이해한 내용이 맞는지는 잘 모르겠다. Aggreegate란 같은 라이프사이클(생성, 수정, 삭제)를 갖는 연관된 객체들의 집합이다! 성능의 이점 spring data jdbc는 레이지 로딩이 없기 때문에 직접 참조를 한다면 참조한 객체의 인스턴스 변수가 몇개든 전부 같이 조회해서 와야한다. 하지만 id를 통한 간접 참조를 한다면 참조한 객체의 id만 조회해오게 되고 성능의 이점을 가져갈 수 있다. 확장성 직접 참조를 하면 아무래도 의존 관계가 형성된다. 하지만 간접 참조를.. WebMvcConfigurer addResourceHandlers 경로 설정 2020. 9. 12. 프로젝트의 성능 개선을 위해 정적 자원을 캐싱하려고 했다. css와 js에 다른 cache-control을 주고 싶었는데 이상하게 자꾸 404가 떴다. WebMvcConfigurer 구현체에서 addResourceHandlers 메서드 재정의를 간단히만 했어서 이 부분이 무지했었나보다 조금만 틀었는데도 헤맸다. 나와 같이 헤매는 사람이 혹시 있을까봐 글을 작성한다. (나만 모르는 것 같긴 하지만..) 기존에는 모든 정적 자원에 1년의 cache period를 줬었다. @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("resources/**") .addResource.. @Mock vs @MockBean 2020. 8. 14. MockMvc로 테스트를 하다가 @Mock과 @MockBean의 차이가 뭔지 궁금해졌다. 비슷하게 생긴 두 어노테이션은 엄연히 용도가 다르다. 간단하게 정리해보자. @Mock 어노테이션 단어 그대로 Mock 객체, 즉 가짜 객체로 쓰겠다는 뜻이다. @ExtendWith(MockitoExtension.class) class ServiceTest { private Service service; @Mock private Repository Repository; @BeforeEach void setUp() { service = new Service(repository); } @Test void findAll() { given(repository.findAll()).willReturn(...); List actu.. 이전 1 2 다음