반응형 Programing497 @MappedSuperclass 에 대해서 알아보자 @MappedSuperclass는 명칭과 같이 상속관계에서 부모 클래스를 매핑 할 때 사용합니다. 기존의 상속관계 매핑에서는 부모 자식 테이블 모두 엔티티로 생성하여 매핑을 하지만, @MappedSuperclass는 부모 클래스는 엔티티로 생성하지 않고 자식 클래스만 엔티티로 생성합니다. 이는 단순히 매핑 정보(엔티티 컬럼)를 상속할 목적으로 사용 됩니다. 예제) 예를들어 위와 같이 MANAGER, EMPLOYEE 테이블이 있다고 할 때, 두 테이블에는 ID와 NAME이 공통으로 있는 것을 보실 수 있습니다. 이 두 컬럼을 부모클래스로 생성해 위의 두 테이블의 엔티티가 상속받도록 합니다. @MappedSuperclass public abstract class CommonEntity { @Id @Colum.. Programing/JPA 2023. 8. 25. JPA could not initialize proxy - no Session 원인 / 해결방법 could not initialize proxy - no Session 해당 오류는 JPA 의 open-in-view 설정과 관련이 있습니다. OSIV open-in-view는 OSIV(Open Session In View) 라 하며 영속성 컨텍스트의 범위를 설정하는 옵션입니다. JPA default 설정 값은 true 이고 영속성 컨텍스트가 트랜젝션의 범위를 넘어서 요청이 끝날 때까지 살아있게 됩니다. false 설정의 경우 트랜젝션 범위 내에서만 영속성 컨텍스트가 살아있게 됩니다. 원인 open-in-view 설정이 false 인 상태에서 트랜젝션 없이 연관관계가 FetchType.LAZY 로 설정한 객체에 접근할 때 발생. /*application.yml*/ spring: jpa: open-in-v.. Programing/JPA 2023. 8. 24. Spring boot 실행 시 경고 문구 해결 방법 You are asking Spring Security to ignore Ant [pattern='/favicon.ico']. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead. [발생 원인] web.ignoring()을 사용할 경우 spring security의 보호를 받을 수 없기 때문에 authorizeHttpRequests().permitAll 에 추가하여 설정하는 방식으로 변경 [경고 발생 코드] @Bean public WebSecurityCustomizer webSecurityCustomizer() { return (web) -> web.ignoring() .antMatche.. Programing/Springboot 2023. 8. 18. @IdClass @EmbeddedId 의 활용 차이 @IdClass @EmbeddedId 모두 JPA에서 복합 기본 키 (Composite Primary Key) 를 다루는 방법입니다. 하나의 Entity에 @Id 를 하나 이상 쓰게되면 매핑 오류가 발생하게 됩니다. 그래서 복합 기본키를 사용할 때는 별도의 키 클래스를 생성해야 합니다. 이 때 생성하는 키 클래스는 다음과 같은 특징이 있습니다. 키 클래스 특징 1. 복합 키는 별도의 키 클래스로 만들어야 한다. 2. Serializable을 implements 받아야한다. 3. equals와 hashCode를 Override 해야 한다. (lombok 에서 @EqualsAndHashCode 사용) 4. 기본 생성자가 있어야 한다. (lombok 에서 @NoArgsConstructor 사용) 5. 키 클래.. Programing/JPA 2023. 8. 18. JPA 연관관계 매핑 알짜만 빼먹기. 일대일 일대다 다대일 다대다 이번 포스팅에서는 JPA 에서 사용되는 연관관계 매핑에 대해서 알아보도록 하겠습니다. 알아보기에 앞서, 알아두어야 할 용어 몇가지만 확인하고 가도록 하겠습니다. 용어 방향( Direction ) 한쪽 Entity에서만 참조하는 것을 '단방향' 관계라고 하고 양쪽 Entity에서 서로 참조하는 것을 '양방향' 관계라고 합니다. DB 테이블은 항상 양방향 관계이고, 객체를 사용하는 JPA에는 단방향만 존재합니다. 정확히 얘기하자면 Entity간 서로 단방향 관계로 양방향 처럼 보이게 합니다. 다중성 ( Multiplicity ) 객체간 관계성을 나타내며, 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N) 이 있습니다. JPA에서는 @ManyToOne, @OneToMany, @OneToOn.. Programing/JPA 2023. 8. 18. mapStruct updateFromDto, null 컬럼 제외하고 update mapStruct의 toEntity 메서드를 활용하여 전달받은 DTO 를 Entity로 변환하여 save 메서드를 호출할 때 전달되지 않은 변수 값의 경우 null로 update 됩니다. [DTO] @AllArgsConstructor @Getter @Setter public class TestDTO { private String grpCdId; private String cdId; private String cdNm; } [Entity] @Setter @Getter @Entity @Table(name = "TEST") public class TestEntity implements Serializable { @Id @Column(name = "grp_cd_id") private String grpCdId .. Programing/JPA 2023. 8. 10. named-native-query @Query에 String을 +로 연결하는게 너무 싫어요! JPA를 사용하다 보면 querydsl에서 지원하지 않거나, 복잡한 쿼리를 작성해야 할 때 org.springframework.data.jpa.repository.Query @Query 를 사용해야 하는 경우가 있습니다. 이런 경우 query를 String으로 연결해서 작성해야 하기 때문에 디버깅 해서 쿼리를 확인해야 할 때나 그 반대의 경우 매~우 불편하죠. Link : https://aljjabaegi.tistory.com/694#2._JPQL_(_Java_Persistence_Query_Language)_and_nativeQuery Querydsl vs Criteria API vs QueryMethod vs JPQL 비교 이전 포스팅에서 Querydsl 을 설정하는 방법을 알아보았습니다. Link .. Programing/JPA 2023. 8. 8. IntelliJ Spring boot 2.x project Java 설정 방법 IntelliJ 를 설치하고 Spring boot 2.x 를 오픈하면 Java 설정을 해줘야 합니다. 물론 JAVA HOME 과 같은 컴파일러를 사용한다면 자동 설정이 되지만 실행 했을 때 문제가 있다면 2군데 혹은 3군데를 수정해 주어야 합니다. 1. Project Struecture 단축키는 ctrl + alt + shift + s 입니다. Project 메뉴에서 SDK를 원하는 버전으로 선택합니다. 2. settings -> gradle gradle project의 경우 Gradle JVM 버전을 변경해 줍니다. settings의 단축키는 ctrl + alt + s 입니다. settings에서 gradle을 검색하여 하단에 Gradle JVM 을 원하는 버전으로 선택합니다. 1,2 번을 수정해도 실.. Programing/JAVA 2023. 7. 31. JpaRepository Custom / repository에 공통 사용 메서드 추가 JpaRepository의 메서드를 활용하면서, 공통으로 활용하는 메서드를 추가하기 위해 JpaRepository를 커스텀 하는 방법을 알아보겠습니다. 1. JpaRepository extends 한 CustomJpaRepository interface 작성 @NoRepositoryBean public interface CustomJpaRepository extends JpaRepository { /*추가로 작성할 메서드를 작성합니다.*/ JPAQueryFactory getQueryFactory(); } @NoRepositoryBean 은 말 그대로 repository bean으로 등록하지 않겠다는 어노테이션 입니다. JpaRespository를 상속받은 CustomJpaRepository interfa.. Programing/JPA 2023. 7. 27. Querydsl vs Criteria API vs QueryMethod vs JPQL 비교 이전 포스팅에서 Querydsl 을 설정하는 방법을 알아보았습니다. Link : https://aljjabaegi.tistory.com/691 Springboot 2.x + queryDSL 설정 방법 JPA를 사용하게 되면 Query method를 사용하면 간단한 조건의 작업들은 가능하지만 복잡한 쿼리로 작성되어야하는 로직의 경우 한계가 있습니다. 물론 어느정도 가능은 하겠지만 query method의 길이가 aljjabaegi.tistory.com 이번에는 JPA에서 활용되는 여러가지 방법들과 Querydsl을 비교해 보도록 하겠습니다. 샘플 쿼리에 있는 내용을 Query method, 샘플 쿼리 SELECT CD_ID , CD_NM , CD_SQNO FROM M_OP_CD WHERE GRP_CD_ID.. Programing/JPA 2023. 7. 20. swagger 응답 타입이 Void 일 때 참조 에러 해결 방법 응답타입에 Void가 있을 때 swagger에서는 아래와 같은 에러를 발생시킵니다. Could not resolve reference: Could not resolve pointer: /definitions/Error-ModelName{namespace='java.lang', name='Void'} does not exist in document 이유는 Swagger에서 Void 를 Model로 인식하지 않기 때문인데요, 이런 에러를 보기 싫다면, 특정 객체를 생성해, Void 대신 사용하면 됩니다. 오류가 나는 코드 public ResponseEntity getCctvList(@RequestBody SearchDTO param) { . . . } 빈 응답 객체로 사용할 클래스 생성 @ApiModel(v.. Programing/JAVA 2023. 7. 20. swagger Could not resolve reference: Could not resolve pointer 오류 수정 방법 swagger 구현 후 특정 Operation을 클릭 했을 때 사용되는 DTO 객체를 참조할 수 없다는 오류가 발생하곤 합니다. Could not resolve reference: Could not resolve pointer: /definitions/TestDTO - 테스트 DTO does not exist in document swagger에서 등록을 할 때 참조를 할 수 없어서 발생하는 오류인데, 대부분 @ApiModel 이나 @ApiModelProperty 의 value 속성에 특수문자를 입력했기 때문에 발생합니다. 예를들어 '' '/' 와 같은 HTML 태그에 사용되는 특수문자나 '[', ']', '{', '}' 와 같은 JSON 형식에서 사용되는 특수문자를 사용했을 때 발생하게 됩니다. 문제가.. Programing/JAVA 2023. 7. 20. Springboot 2.x + queryDSL 설정 방법 JPA를 사용하게 되면 Query method를 사용하면 간단한 조건의 작업들은 가능하지만 복잡한 쿼리로 작성되어야하는 로직의 경우 한계가 있습니다. 물론 어느정도 가능은 하겠지만 query method의 길이가 엄청나게 길어지겠죠. 이를 보완하기 위해 @Query, JPQL 를 사용하도 합니다. 하지만 문자열을 + 로 연결해야 하며 가독성도 떨어지고, 유지관리에 어려움이 있습니다. 1. Query method List findByKeyUserIdAndKeyAtndYmdBetweenOrderByKeyAtndYmd(String UseId, Date first, Date last); 2. @Query @Query(value = "select count(*)" + " from (" + " select *" +.. Programing/JPA 2023. 7. 18. Factory Method Pattern 팩토리메서드 패턴 GoF 디자인패턴 GoF 디자인 패턴 중 생성패턴의 하나인 Factory Method 패턴에 대해 알아보도록 하겠습니다. 특징 팩토리 메서드 패턴 (Factory Method Pattern)은 객체 생성에 관련된 디자인 패턴 중의 하나로, 객체의 생성을 서브클래스로 분리하여 객체를 생성하는 방식을 추상화 하는데 사용됩니다. 추상화된 팩토리 클래스에 대한 인터페이스를 제공하고, 이를 구체화하여 서브클래스에서 실제 객체를 생성하는 메서드를 구현(캡슐화)합니다. 이를 통해 객체 생성 로직을 클라이언트로부터 분리하고, 유연성과 확장성을 제공합니다. 샘플코드 public interface CommonResponse { Object getData(); } public class JpaResponse implements CommonR.. Programing/Design Patterns 2023. 7. 12. Abstract Factory Pattern 추상팩토리 패턴 GoF 디자인패턴 GoF 디자인 패턴 중 생성패턴의 하나인 Abstract Factory 패턴에 대해 알아보도록 하겠습니다. 특징 추상 팩토리 패턴 (Abstract Factory Pattern)은 객체 생성에 관련된 디자인 패턴 중의 하나로, 관련된 객체들의 팩토리를 생성하기 위한 인터페이스를 제공하며, 이 팩토리를 사용하여 서로 다른 객체들의 그룹을 생성할 수 있습니다. 객체들의 생성로직을 클라이언트로부터 분리하여 객체 간 결합도를 낮추고, 유연성과 확장성을 높이는데 사용됩니다. 샘플코드 Jpa와 Mybatis로 응답을 받는 2개의 추상 객체를 정의하고, 각각 응답에 대한 로직을 구현한 구체적인 객체를 생성하는 팩토리를 만들어보겠습니다. public interface CommonResponse { Object getD.. Programing/Design Patterns 2023. 7. 12. 이전 1 2 3 4 5 ··· 34 다음 💲 추천 글 반응형