본문 바로가기

전체 글

(262)
presentation layer, service layer 명확히 구분 짓는 코드 JPA김영한님의 책을 읽고 있다. 13장에서 프리젠테이션, 서비스, 레포지토리 레이어의 분리와 역할침범에 대해서 많이 나온다. 고민하다가 내가 쓴 코드가 꽤나 문제를 해결해주는 것 같아서 블로그로 남기고자 한다. 먼저 레이어간 침범이 일어나는 경우가 뭔지 알아보자(JPA 책 584p에 잘 설명되어 있다.) 뷰에서 필요한 정보에 따라 다른 서비스 레이어 메소드가 필요한 경우. 뷰까지는 영속성 컨텍스트와 트랜잭션이 살아있지 않기 때문에 지연로딩이 불가능하다. 지연로딩이 불가능하기 때문에 프록시 객체를 강제 초기화 하는 방법을 사용하면 뷰마다 어떤 정보가 필요한지 알고 메소드마다 같은 기능을 하더라도 어떤 메소드는 프록시 객체를 강제 초기화. 어떤 메소드는 초기화 하지 않고 반환하게 된다. 최적화를 위해서라면..
기술에 대한 인사이트 이번에 spring boot + jpa를 사용하면서 기술에 대한 많은 생각을 하게 되었다. 내 생각의 흐름을 보자. 1. 다들 쓰는 라이브러리 나도 써야지. 대충 블로그 보고 사용법만 알면 그냥 쓰면되지! 2. 그냥 가져다 쓰면 성능이나 여러가지 문제가 생길 수 있구나.. 진짜 아는 것만 써야겠다. 3. spring boot, JPA마저도 잘 모르는데 뭔 다른 라이브러리를 쓰겠나... 도커고 쿠버고..AWS고...일단 springboot, jpa 내부 구현부터 이해해보자...라는 생각... 모르는게 너무 많고 그냥 책에서 이렇다고하니까 이렇구나~라고 외우기에는 이건 능력이 아닌듯. 그냥 암기이지. 예를 들어 영속성 컨텍스트는 트랜잭션이 생성되고 끝날때 같이 생성 종료된다는데 이런 것들이 어떻게 구현되어 ..
이건 해결해야겠다. save() 2번 호출했을 때 왜 연관된 엔티티가 영속상태가 아닌데도 save()에서 예외가 발생하지 않는가? 아래의 코드에서 예외가 발생해야 한다는게 내 생각이다. 1. 엔티티를 저장할 때 연관된 엔티티는 영속상태이어야 한다. 2. 영속성 컨텍스트는 트랜잭션이 begin할 때 생성되고 commit할 때 닫힌다. 위의 2개의 사실을 종합해봤을 때 아래 코드에서 예외가 발생해야한다. 그렇지만 예외가 발생하지 않는다. @SpringBootTest //@Transactional //트랜잭션을 지웠다. class CakeRepositroyTest { @Autowired CakeRepositroy cakeRepositroy; @Autowired StoreRepository storeRepository; @Test public void saveTest() { Store s = Store.builder() .name("스토어..
@Transactional 주의점. 영속성 컨텍스트의 생명주기 아래처럼 @Transactional을 붙인 상태에서는 setFcmToken()에 따른 update문이 동작한다. @SpringBootTest @Commit @Transactional class CustomerRepositoryTest { @Autowired CustomerRepository customerRepository; /** * 없을 때 null을 반환하지는 않는다. 빈 리스트를 반환함. */ @Test public void findBySnsTypeAndSnsIdentifyKeyTest() { Customer customer = Customer.builder().build(); customerRepository.save(customer); customer.setFcmToken("1"); List ..
2022.08.07~8 8.7 어제는 창업캠프, 교육을 갔다. 포켓캠프라고 하는 곳에 신청해서 선발되었다. 생각보다 시설이 너무 좋아서 놀랐다. 환경이 맘에 쏙 들었다. 건물 4층에 위치했었는데 인조잔디, 감성음악, 캠핑같은 분위기, 마이크, 빔프로젝트. 마치 위워크광고에서 볼 수 있는 그런 공간이었다. 여기서 일하면 일할맛 나겠다... 모니터만 있으면...이라고 생각했다. 이게 스타트업 업계인가.. 확실히 젊고 생생한 느낌을 체감할 수 있었다. 처음에 앉아서 대표님들의 경험담을 듣고 자기소개를 하는 시간을 가졌다. AI 창업 기술 창업 하신 대표님이 여러 질문을 던져 왜 창업하는가. 왜 나, 우리팀이어야 하는가에 대한 질문을 했는데 좋은 시간이었다. 예전에 EO에서 왜 이 문제를 푸는 사람이 우리팀이고 나여야 하는가에 대한 ..
[Jackson] java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class X / Map<-> Object : convertValue() / jackson always needs Getter!! 공모전 준비중인 MyOrder가 거의 개발을 끝냈다. 시연동영상을 제출해야하기 때문에 시연 동영상 시나리오를 짜고 마감전에 미리 시나리오 테스트를 진행해보려 한다. 근데 제목과 같이 자꾸 예외가 발생했다. 원인을 글 맨 밑의 링크에서 쉽게 찾을 수 있었다. 이 내용을 짧게 정리하고자 한다. @Test public void scenarioTest() throws Exception { List demands = testRepository.insertAll(); //사용자 가져오기 MvcResult mvcResult = mvc.perform(get("/get-test-customer")) .andExpect(status().isOk()) .andExpect(jsonPath("$.jwt").exists()) ...
형식을 알지 못하는 JSON을 클래스로 만들 수 있을까? 먼저 도대체 형식을 알지 못하는 JSON을 파싱해야하는 경우가 어떤 경우인지 알아보자. 여러 가지를 정할 수 있는 음식주문 서비스를 생각해보자. 가게마다 가능한 옵션이 다를 것이다. 중국집에는 짜장면 : [오이x, 양파x, 파x, 고기x]. 분식집에서는 라면 : [계란o, 파o, 양파o, 고기o] 와 같은 옵션이 가능할 것이다. 이것을 DB에 어떻게 저장할 수 있을까? 컬럼에는 저장이 불가능하다고 판단했고..무한 컬럼을 사용할 수는 없으니까...DB에 JSON 형식을 사용해서 저장하기로 했다. 그리고 클라이언트가 json을 알아서 파싱해서 사용하기로 했다. json object 변환에 대해서는 여러 라이브러리가 있고 자료도 많다. 하지만 이 상황은 전부 JSON응답 형식을 알고 있을 때 변환하는 상황이다..
[SpringBoot] 엔티티에는 setter를 두지 않는다. 확장성 있는 함수구성 왜 엔티티에 setter를 두지 않는지 몇개의 블로그를 읽고 정리했다. https://velog.io/@aidenshin/%EB%82%B4%EA%B0%80-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-JPA-%EC%97%94%ED%8B%B0%ED%8B%B0-%EC%9E%91%EC%84%B1-%EC%9B%90%EC%B9%99 JPA 엔티티 작성 - Setter 금지 엔티티를 작성함에 제가 생각하는 몇가지 원칙(?)이 있습니다.그중 엔티티(객체)의 Setter 사용 금지 원칙(?) 에 대해 알아보겠습니다.엔티티를 작성할 때 습관적으로 모든 필드에 Setter를 생성하는 velog.io setter는 메서드의 의도를 알기 힘들다. setter가 아닌 상황에 맞는 메서드를 만들어서(사실 기..