본문 바로가기

CS 잡지식

JPQL 쿼리문 작성 시, 생길 수 있는 어이없는 에러 entityManager.createQuery( "select" + " new jpabook.jpashop.repository.OrderSimpleQueryDTO(o.id, m.name, o.orderDate, o.orderStatus, d.address)" + " from Order o" + " join o.member m" + " join o.delivery d", OrderSimpleQueryDTO.class) .getResultList(); [띄워쓰기]에 주의해 줘야 한다. 위 코드는 정상적인 코드이다. 아래의 코드를 보자. public List findOrderDTOs() { // new OrderSimpleQueryDTO(매개변수) 연산자를 통해 JPQL에서 바로 DTO로 변환해서 반환받을 수.. 더보기
인텔리J의 변수 명, 메서드 명, 클래스 명 한방에 수정하기(Feat. Shift + f6) OrderSimpleQueryDTO라는 클래스 파일이 있고, 그것을 다른 클래스 파일에서 사용하고 있는 장면이다. 그런데, OrderSimpleQueryDTO12345라고 클래스명을 지었어야 했는데, 잘못 지어버려서 수정을 해야 한다. 그러나 만약 이 OrderSimpleQueryDTO 클래스가 파일 100 군데에 있다면, 일일이 찾아 가서 수정을 해야 하는 어마어마한 상황이 벌어진다. 이때 단축키 [Shift + f6]을 누르고, OrderSimpleQueryDTO로 고쳐주면, 파일 100군데에 있는, OrderSimpleQueryDTO 명이 자동으로 OrderSimpleQueryDTO12345로 변경이 된다. (window 기준 단축키이며, mac은 단축키가 다르다) 더보기
[Lazy로딩] 설정으로 인해 발생할 수 있는 치명적인 JPA 버그(매우 매우 중요)[feat. Hibernate5Module] 코드는 https://jbluke.tistory.com/414 [양방향] 설정으로 인해 발생할 수 있는 치명적인 JPA 버그(매우 매우 중요) @RestController @RequiredArgsConstructor public class OrderSimpleApiController { // 이 Controller는 DB에 있는 정보를 [조회]해와서 뿌리는 API용이다. // 즉, 회원 가입 등의 기능을 여기서 필요로 하지 않기에 Service 계 jbluke.tistory.com 를 이어서 설명을 한다. [양방향]에 의한 무한 루프 에러는 @JSONIgnore로 해결이 가능했다. 그러나, 여전히 API를 호출을 해도 에러가 난다. HTTPConversionException이 터진다고 나온다. 지금 이 .. 더보기
Gradle과 Maven의 차이 우리가 Maven,Gralde에서 implement "~~~"을 하면, 위 API(URL로 돼 있음)가 호출되면서 그 결과로 라이브러리가 다운 로드 되는 거였다. 더보기
[양방향] 설정으로 인해 발생할 수 있는 치명적인 JPA 버그(매우 매우 중요) @RestController @RequiredArgsConstructor public class OrderSimpleApiController { // 이 Controller는 DB에 있는 정보를 [조회]해와서 뿌리는 API용이다. // 즉, 회원 가입 등의 기능을 여기서 필요로 하지 않기에 Service 계층을 거치지 않아도 된다. private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List ordersV1(){ List findOrders = orderRepository.findAllByString(new OrderSearch()); return findOrders; } 이 API를 호출했다고.. 더보기
DB 설계 시, 다중성 설정이 헷갈릴 때의 tip!! A,B 2개의 Table이 있다고 하자. A와 B Table 사이의 다중성이 잘 파악되지 않을 때는, 2가지 작업을 거쳐 보자. STEP 1 : A를 1로 뒀을 때, B는 몇 개가 되는지 STEP 2 : 반대로 B를 1로 뒀을 때, A는 몇개가 되는지 -> 만약 STEP 1,2의 결과 A,B 둘 중 하나라도 多가 나오면, 예를 들어, A만 多라면, A : B = 多:1이며, A,B 모두 多라면 A : B = 多:多가 된다. 더보기
기승전"DB" - 서버의 성능은 [DB]에 의해 결정된다 서버의 개발에 있어서, 대부분의 에러와 성능 ISSUE는 DB에서 만들어 진다. 특히, 서버를 개발할 때 DB를 최적화하는 과정(DB 튜닝)을 거치지 않으면, 엄~~~청난 성능 차이를 보이게 되므로 필수이다. DB 최적화 중에서도, [저장],[삭제],[수정] 부분에서는 최적화 과정의 유무에 상관없이 성능에 별 차이가 존재하지 않는다. 그러나 문제는 바로 [조회] 기능이다. 1] 페이징 과정에서 생기는 엄청난 DB 연산 2] 컬렉션 조회 최적화 문제 3] 지연 로딩,즉시 로딩에서 생기는 N + 1 문제 등등, [조회]에서는 DB가 JOIN 연산을 주로 하기에 성능 ISSUE가 많이 생긴다. ( API 사용자들이 주로 [조회]를 많이 하기 때문에 생기기 때문에 성능 ISSUE가 생기는 부분도 크다 ) [Sp.. 더보기
Rest API 개발 시, List<E> 등의 [컬렉션]을 [직접] 반환하지 말 것! 결론부터 말을 하자면, 컬렉션을 [직접] 반환하면 항후 API 스펙을 변경하기 어렵기 때문에, 컬렉션을 별도의 클래스로 한 번 Wrapping을 한 후에 넘겨줘야 한다(무슨 말인지는 아래를 천천히 읽어 보자). (사전 지식 : JSON은 실체는 쌍의 배열이다 EX) "id": 1, "name": "jin young kim", 위와 같은 JSON이 있다고 하자. 이것의 실체는 List json = new ArrayList()에 불과하다. "id": 1, "name": "jin young kim", "address": { "city": "해운대구", "street": "해운대로781번길23, 101동 1702호", "zipcode": "48102" } 위 address는 컬렉션이 반환이 된 것이다. json.. 더보기