본문 바로가기

Spring

Springdoc을 이용한 swagger3 구현 1.build.gradle implementation 'org.springdoc:springdoc-openapi-ui:1.7.0' 2.application.properties springdoc.swagger-ui.path=/swagger-ui.html #swagger 접속 주소 ex) localhost:8080/swagger-ui.html springdoc.swagger-ui.groups-order=asc #swagger group 정렬 순서 desc,asc springdoc.swagger-ui.operations-sorter= # method순으로 정렬 Reference https://springdoc.org/properties.html Springdoc-openapi Properties springd.. 더보기
Entity를 변경하는 방법(Merge와 변경감지) Merge 동작 방식 1. 파라미터로 넘어온 준영속 엔티티의 식별자 값으로 1차 캐시에서 엔티티를 조회한다. 1-1. 만약 1차 캐시에 엔티티가 없으면 데이터베이스에서 엔티티를 조회하고, 1차 캐시에 저장한다. 2. 조회한 영속 엔티티에 member 엔티티의 값을 채워 넣는다. 3. 영속 상태인 mergeMember를 반환한다. 4.트랜젝션 커밋 시점에 변경 감지 기능이 동작해서 데이터베이스에 UPDATE SQL이 실행된다. Merge와 변경감지의 차이점 변경감지를 이용하면 원하는 속성만 선택해서 변경 할 수 있지만 ,병합을 사용하면 모든 속성이 변경되므로 병합시 값이 없으면 null로 업데이트 할 위험이 있다.엔티티를 변경할때는 무조건 변경감지를 이용해야 한다. Entity 변경 시 주의점 (1)컨트롤.. 더보기
h2-console 연동하기 Memory application.properties spring.h2.console.enabled=true spring.datasource.url=jdbc:h2:mem:db이름 spring.datasource.username= sa spring.datasource.password= spring.datasource.driver-class-name=org.h2.Driver Server DB 생성 DB 생성 후 이후 접속 application.properties spring.datasource.url=jdbc:h2:tcp://localhost/~/DB이름 spring.datasource.username=sa spring.datasource.password= spring.datasource.driver-cla.. 더보기
JPQL DTO Select List result = em.createQuery("select new jpql.MemberDto(m.username,m.age) from Member m", MemberDto.class) .getResultList(); for (MemberDto memberDto : result) { System.out.println("Username = " + memberDto.getUsername()); System.out.println("age = " + memberDto.getAge()); } new 명령어를 사용하여 패키지를 포함한 전체클래스명을 입력하여 사용한다. 순서와 타입이 일치하는 생성자가 필요하다. 페이징 List result = em.createQuery("select m fr.. 더보기
값 타입 컬렉션 값 타입 컬렉션 사용 public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ElementCollection @CollectionTable(name = "FAVORITE_FOODS",joinColumns = @JoinColumn(name = "MEMBER_ID")) @Column(name = "FOOD_NAME") private Set favoriteFoods = new HashSet(); @ElementCollection @CollectionTable(name ="ADDRESS",joinColumns = @JoinColumn(name = "MEMBER_ID")) private .. 더보기
임베디드 타입 임베디드 타입 정의 @Embeddable public class Address { private String city; private String street; private String zipcode; public Address() { } ... } @Embeddable 어노테이션을 사용하여 임베디드 타입을 정의할 수 있다. 임베디드 타입은 기본생성자가 필수로 있어야한다. 임베디드 타입 사용 @Entity @Table(name = "ORDERS") public class Order { @Id @GeneratedValue private Long id; private int orderAmount; @Embedded private Address address; ... } 임베디드 값타입을 사용하는 엔티티에 .. 더보기
프록시와 연관관계 관리 프록시 (1) 프록시는 실제클래스를 상속받아서 만들어지므로 타입 체크 시 instance of를 사용해야 한다 (2) 프록시 객체는 실제객체의 참조를 보관했다가 호출되면 실제객체의 메서드를 호출한다. (3) 프록시 객체는 처음 사용할 때 한번만 초기화 되며 초기화 될 때 실제 엔티티로 바뀌는 것이아니라 프록시 객체를 통해서 실제 엔티티에 접근 가능하다. (4) 영속성 컨텍스트에 프록시가 찾는 엔티티가 있으면 실제엔티티가 반환된다. (5) 찾는 엔티티가 영속성컨텍스트의 도움을 받을 수 없는 준영속 상태일 때 프록시를 초기화하면 예외가 발생한다. 연관관계관리 즉시로딩 public class TeamMember { @Id @GeneratedValue @Column(name = "TEAM_MEMBER_ID") .. 더보기
매핑정보 상속 매핑정보 상속(@MappedSuperClass) 객체에 공통매핑 정보가 필요할떄 사용된다. 상속관계를 매핑할수 없다. 직접 생성해서 사용할일이 없으므로 추상클래스(abstract class)를 사용한다. @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class TimeStamped { @CreatedDate //Entity가 생성되어 저장될 때 시간이 자동 저장 private LocalDateTime createdAt; @LastModifiedDate //조회한 Entity의 값을 변경할 때 시간이 자동 저장 private LocalDateTime modifiedAt; } 더보기