[JPA] Oracle 을 사용해서 Native Query 로 출력 개수까지 다 가져와보기
예를 들어, 아래와 같은 복잡한 질의가 있다. SELECT so.seqno , ... , CASE WHEN SYSDATE BETWEEN MIN(ev.startdate) AND MIN(ev.enddate) THEN 'Y' ELSE 'N' END AS event_flag , TO_CHAR(MIN(so.display_start), 'yyyy-mm-dd hh24:mi') AS display_start , TO_CHAR(MAX(so.display_end), 'yyyy-mm-dd hh24:mi') AS display_end , TO_CHAR(MIN(ev.startdate), 'yyyy-mm-dd hh24:mi') AS event_start_date , TO_CHAR(MAX(ev.enddate), 'yyyy-mm-d..
2022.10.17
no image
[Spring] 라이브러리 등록 시 라이브러리를 외부에서 소스를 볼 수 있도록 하기
예를 들어, Intellij 에서 직접 External Libraries 또는 어떤 객체의 사용 위치를 참조하여 파일을 살펴볼 때 아래와 비슷하게 메세지가 나타나는 경우가 있다. Decompiled .class file, bytecode version: 57.0 (Java 13) 보통 개발을 하면서 문제가 생겼을 때 디버깅을 찍어보면서 Spring 과 같은 다른 라이브러리의 내부 코드를 들여다보던지 아니면 평소대로 라이브러리에서 지원하는 메서드를 사용하려고 할 때 주석이라던지를 참조를 하게 되는데 자기가 직접 스스로 라이브러리를 만들면서 Maven 또는 직접 운영하는 Nexus 에 라이브러리를 등록하여 사용을 할 때 만약 아무런 빌드 옵션을 주지 않고 등록을 하게 되면 위와 같이 바이트 코드만 볼 수 있..
2022.10.13
[JPA] H2 DDL 초기 테스트 데이터 설정
요구 사항 만약, 아래와 같은 Entity 를 H2 데이터베이스 같은 곳에서 자동으로 DDL 이 이루어진 다음, 그 후에 스크립트 기반으로 데이터를 미리 넣어서 테스트 코드로 데이터를 사용하고 싶다고 해보자 @Builder @Getter @NoArgsConstructor @AllArgsConstructor @Entity @Table(name = "BOOKS") @DynamicInsert @DynamicUpdate public class Books { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID", nullable = false) private Long id; @Column(name = "BOOK_CODE", null..
2022.10.01
no image
[Spring] Kafka 이용 시 __TypeId__ 에 대하여
Kafka 를 사용하다보면 __TypeId__ 이라는 Header 를 마주하는 경우가 있다. 이 Header 를 보았다면 아마도 JsonSerializer 를 사용하는 Kafka Producer 에서 생성된 메세지의 Header 를 보았을 가능성이 매우 높다. 이 __TypeId__ 라는 헤더는 메세지를 보낼 때의 데이터 객체 타입 이름을 가지고 있다. 아래처럼 Value 타입이 Object 인 JsonSerializer 를 사용하는 Kafka Producer 에서 send 메서드를 통해 메세지를 보낼 때, 메세지 파라미터의 데이터 타입에 따라 해당 데이터의 타입 이름이 들어가게 된다. @Override public ListenableFuture sendQueue(@NonNull final PostKaf..
2022.08.02
no image
[Spring] @ModelAttribute 파라미터에서 사용 방법 및 원리
@ModelAttribute 는 클라이언트로부터 일반 HTTP 요청 파라미터나 multipart/form-data 형태의 파라미터를 받아 객체로 사용하고 싶을 때 이용된다. 사용 방법 @ModelAttribute 는 parameter, method 레벨로 두 가지의 방식을 지원하고 있다. @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ModelAttribute { ... } @ModelAttribute 를 이용할 DTO 클래스에서는 아래처럼 생성자를 구현해도 사용할 수 있다. 단, 요청 파라미터와 매개변수 이름이 서로 같아야 한다. pack..
2022.07.30
no image
[Spring] JPA 에서 Oracle DB 사용할 때 DB 함수 사용하기
JPAExpressions 와 SQLExpressions 를 섞어서 사용할 수 없기 때문에 사용자가 수동으로 함수를 등록해주어야 한다. (대소문자는 상관없다) 이는 QueryDSL 에서도 적용이 되는데, 먼저 DB 설정에서 Adapter 를 설정해줄 때 아래와 같이 코드를 입력해주고, EntityManagerFactory 에서 사용하도록 해준다. ... @Bean public JpaVendorAdapter dbJpaVendorAdapter() { HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setDatabasePlatform("kr.pe.karsei.configs.DbDialect"); // Dialect 연결 ..
2022.04.04
no image
[Spring] JPA 와 Mybatis 동시 사용 시 Connection Deadlock 벗어나기
PHP 에서 Java 로 작업을 진행하면서 기존에 작성했던 Query 문을 사용해야 할 필요가 생었겼다. 근데 한번에 효율적으로 데이터들을 불러오려고 작성된 Query 를 사용하려다보니 우선은 Query 문의 길이가 길었고, DBMS 의 고유 기능을 사용한 것이 많았다. 사내에서 작성된 Query 들을 되돌아보니 DB 테이블들이 상당히 많아 복합적으로 Join 을 하거나 서브쿼리가 많이 존재했고, Oracle 의 START WITH ... CONNECT BY ... 처럼 특수 기능을 사용하고 있거나, LOB 관련 함수 등 그저 JPA 만으로는 분명 해결하기 까다로운 이슈들이 있다고 생각했다. 난이도도 있고 QueryDSL 를 사용한다고 해도 다른 사람들이 유지보수를 할 때 과연 잘 할 수 있을까? 하는 ..
2022.04.04