본문 바로가기
반응형

개발/Spring71

[JPA] 상속매핑 종류와 특성 조인전략 (정석) 장점 - 정규화가 되어있다 - 외래 키 참조 무결정 제약조건 활용가능 - 저장공간의 효율화 단점 - 조회시 조인을 사용하기때문에 쿼리가 복잡하며 성능이 저하 - 데이터 저장시 insert sql 2번 호출 (부모, 자식을 넣어야하기때문) 단일테이블 전략 장점 - 조인이 필요없으므로 조회성능 빠름 - 조회쿼리 단순함 단점 - 자식 엔티티의 컬럼 null 허용 - 단일 테이블에 모든것을 저장하므로 테이블이 커질수도 있으며 상황에 따라서 성능저하가 올 수 있다. 구현 클래스마다 테이블 전략 - 사용추천하지않음 2020. 1. 2.
[JPA] @DiscriminatorColumn 속성 상속관계 매핑을 할때 사용되는 속성이다. 예를들어 아래와같이 Book 엔티티와 MAGAZINE 엔티티가 ITEM 엔티티를 상속받을때 ITEM에 @DiscriminatorColumn 속성을 추가하게 된다면 DTYPE 속성이 추가되어 BOOK과 MAGAZINE중에 어느 엔티티때문에 추가가 되었는지 알 수 있다. 기본값으로 DTYPE에는 엔티티의 이름으로 추가가되는데 @DiscriminatorValue 어노테이션을 사용하게 된다면 사용자가 직접 설정할수도 있다. 예를들어 BOOK때문에 추가될때는 ByBook , MAGAZINE때문에 추가할때는 ByMagazine 이라는값으로 설정하고싶을때 @DiscriminatorValue("ByBook") @DiscriminatorValue("ByMagazine") 이런식으.. 2020. 1. 2.
[JPA] 일대일 매핑 외래키 관리 주 테이블에 외래키가 있는경우 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 없는지 판별가능 단점 : 외래키에 null값 허용 대상 테이블에 외래키가 있는경우 장점 : 관계를 1:1에서 1:N으로 변경할때 테이블 구조 유지 가능 단점 : JPA의 기본 프록시기능의 한계로 지연로딩으로 설정해도 항상 즉시로딩된다. 2020. 1. 1.
[JPA] 일대다 관계 설정시 주의사항 - 1:N 에서 1이 연관관계의 주인이 되는 설정인데 실제 테이블에서는 N쪽이 외래키를 가지고있음. 그렇기때문에 원치않는 update 쿼리가 추가로 실행될 수 있음 - @JoinColumn 을 꼭 사용해야한다. 그렇지않으면 중간테이블을 하나 생성해서 사용한다. 1:N 보다는 N:1 매핑을 사용하는것이 낫다! 2020. 1. 1.
[JPA] 양방향 연관관계 설정시 주의사항 1. 최대한 단방향으로 처리할것 (어쩔수 없는경우에만 양방향 연관관계 사용) 2. 주인을 외래키 있는곳으로 지정할 것 3. 양방향 매핑시 무한루프 주의 (toString, lombok, JSON 생성 라이브러리) → toString 사용자제 → lombok에서 toString 생성은 빼고 사용 → 데이터를 주고받을때 엔티티를 사용하지말고 DTO를 만들어서 사용하자 2019. 12. 31.
[JPA] spring.jpa.hibernate.ddl-auto=update 주의사항 컬럼추가시에는 추가가되지만 존재하던 컬럼 삭제시에는 적용되지않는다. 2019. 12. 26.
[spring boot] war 파일 생성 1. build.gradle파일 수정 2. SpringBootServletInitializer 상속 3. war 파일 생성 더블클릭하면 프로젝트경로\build\libs 에 war파일이 생성된다. 2019. 12. 23.
[spring boot] src/main/resources 접근하기 (org.thymeleaf.exceptions.TemplateInputException) src/main/resources 하위에 있는 main.html 에 접근하고 싶을때가 있을거다 src/main/resources 하위에 있는 main.html 에 접근하기 위하여 위와 같이 작성을 하고 실행을 하게되면 org.thymeleaf.exceptions.TemplateInputException 오류를 마주하게 될것이다. 해결방법은 간단하다. Gradle파일에 thymeleaf 설정을 해주기만 하면된다. 위와 같이 타임리프를 implementation 해준후 buile clean을 해준 후 다시 실행을 하면 정상적으로 작동한다! 2019. 12. 18.
[JPA]No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer 로직상으로는 요청을 받고 값을 가공해서 Map객체에 넣어준 후 Return만 하면 끝이라서 전혀 문제가 없어보였다. 허나 돌려보면 No SNo serializer found for class 이라는 오류가 계속 났다. 이유는 ManyToOne의 옵션의 Lazy여서 나는것같다. * LAZY옵션은 필요할때 조회를 해오는 옵션이다. 필요가 없으면 조회를 안해서 비어있는 객체를 serializer 하려고 해서 발생되는 문제인것 같다. 해결방법은 3가지가 있다. 1. application 파일에 spring.jackson.serialization.fail-on-empty-beans=false 설정해주기 2. 오류가 나는 엔티티의 LAZY 설정을 EAGER로 바꿔주기 3. 오류가 나는 컬럼에 @JsonIgnore를.. 2019. 12. 10.
[JPA] Error executing DDL "alter table board add constraint FKfyf1fchnby6hndhlfaidier1r foreign key (user_id) references user (id)" spring.jpa.hibernate.ddl-auto=create-drop 옵션을 사용해서 테이블을 다시 만들때 하나의 테이블에 데이터가 있는상태에서 다른 테이블의 키를 foreign key로 등록하려고 할때 발생된다. ex) board테이블에 user_id 가 1인 row가 있고 user table에 데이터가 없는 상태에서 추가할때 해결방법 : user table 에 user_id가 1인 row를 삽입하면된다. 2019. 12. 8.
[spring boot jpa] Failed to create query for method public abstract java.util.List 오류 이렇게 하고 실행을하면 될것같지만 막상 실행을 시켜보면 Failed to create query for method public abstract java.util.List 오류가 난다. 긴 오류들을 읽어보면 매칭할 컬럼이나 타입이 안맞다고 나온다. 이름을 이것저것 바꾸어보기도해도 안되서 검색을 해보았더니 자바에서는 카멜표기법을 권장하기때문에 카멜표기법으로 변경을 해주면 해결이 된다는글을 찾아서 했더니 실행이 되었다. 결론 : 스네이크표기법 -> 카멜표기법으로 바꾸면 해결! 2019. 12. 5.