목록전체 글 (531)
개발놀이터
*Restful API 설계 앞으로 보여주는 예제들은 XToOne (ManyTonOne, OneToOne) 인 상황에서의 성능 최적화를 다루고 있다. *version1 = 응답 값으로 엔티티를 직접 외부에 노출함 @GetMapping("/api/v1/simple-orders") public List orderV1() { List all = orderRepository.findAll(new OrderSearch()); return all; } 문제점 1. 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다. 2. 기본적으로 엔티티의 모든 값이 노출된다. 3. 응답 스펙을 맞추기 위한 로직이 추가된다. (@JsonIgnore, 별도에 뷰 로직 등등) 4. 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다..
해당 에러의 원인은 종속성 관계에 있다. 두개의 객체가 서로 관계를 가지고 있다면 (1대1, 1대다) A인스턴스에 a1, a2 B인스턴스에 b 이렇게 두개의 인스턴스의 값을 디비에 집어 넣으려는데 a1을 넣으면 b가 자동으로 디비에 입력되고 a2를 넣으면 b가 또 디비에 입력되어서 b에 해당하는 엔티티를 디비에서 이미 가지고 있기 때문에 생기는 에러다. 보통 cascade를 ALL로 설정했을 때 생기는 일이며 cascade를 없애주면 해결되는 일이다. 나의 경우에는 for문을 돌면서 중복된것을 확인하고 확인함과 동시에 insert를 했기 때문에 생긴 해프닝이었다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'announcementService' defined in file [D:\stock\stock\out\production\classes\project\stock\service\AnnouncementService.class]: Initialization of bean failed; nested exception is java.lang.IllegalStateException: Encountered invalid @Scheduled method 'compare': Only no-arg methods may be annotated with @Schedule..
*사용법 ①선언 import java.util.Timer import java.util.TimerTask ②초기화 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override }; ③구현 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { 반복하고싶은 코드 } }; timer.scheduleAtFixedRate(task, 1000, 60 * 1000); scheduleAtFixedRate의 첫번째 인자값은 반복하고싶은 TimeTask, 두번째 인자값은 해당 인자값 후에 실행, 세번째 인자값은 몇초단위로 반복할지 단위는 ms 즉..
*변경감지(Dirty Checking)와 병합(merge) 준영속 엔티티란? 영속성 컨텍스트가 더는 관리하지 않는 엔티티를 말한다. em.persist로 넣을 때 혹은 em.find 등으로 디비에서 값을 가져올 때 영속성 컨텍스트에 데이터들이 들어간다. 임의로 만든 엔티티가 식별자를 가지고 있으면 준영속 엔티티로 간주한다. 준영속 엔티티를 수정하는 2가지 방법 1. 변경감지(Dirty Checking) 2. 병합(merge) 1. 변경감지 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법이다. 트랜잭션 안에서 엔티티르 다시 조회, 변경할 값 선택 -> 트랜잭션 커밋 시점에 변경 감지가 작동해 데이터베이스에 update 쿼리가 날아간다. 2. 병합 병합의 동작 방식 1. merge()를..
*경로표현식 경로표현식이란? .(점)을 찍어 객체 그래프를 탐색하는 것 select m.name -> m.name = 상태 필드 from Member m join m.team t -> m.team = 단일 값 연관 필드 join m.orders o where -> m.orders = 컬렉션 값 연관 필드 t.name = 'teamA' 상태필드 : 단순히 값을 저장하기 위한 필드 = 경로 탐색의 끝, 탐색 X 연관필드 : 연관관계를 위한 필드 -단일 값 연관 필드 (@ManyToOne, @OneToOne, 대상이 엔티티) = 묵시적 내부조인 발생, 탐색 O -컬렉션 값 연관 필드 (@OneToMany, @ManyToMany, 대상이 컬렉션) = 묵시적 내부조인 발생, 탐색 X 묵시적 조인, 명시적 조인 묵..
*JPQL -테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리 -SQL을 추상화해서 특정 데이터베이스 SQL에 의존X -JPQL을 한마디로 정의하면 객체 지향 SQL JPQL이 해결해야할 가장 큰 문제점 = 동적쿼리 그에 따른 해결책 = Criteria, Querydsl Criteria의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -JPA 공식기능 -치명적인 단점 : 너무 복잡하고 실용성이 없다. -Criteria대신 Querydsl 사용 권장 Querydsl의 특징 -문자가 아닌 자바코드로 JPQL을 작성할 수 있음 -JPQL 빌더 역할 -컴파일 시점에 문법 오류를 찾을 수 있음 -동적 쿼리 작성 편리함 -단순하고 쉬움 -실무 사용 권장 *JPQL 소개 -JPQ..
*값 타입 JPA의 데이터 타입 분류에는 두가지 타입이 있다. 1. 엔티티 타입 2. 값 타입 1. 엔티티 타입 특징 1-1. @Entity로 정의하는 객체 1-2. 데이터가 변해도 식별자로 지속해서 추적 가능 (PK) 1-3. ex) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 추적 가능 2. 값 타입 특징 2-1. int ,Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 2-2. 식별자가 없고 값만 있으므로 변경시 추적 불가 2-3. ex) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입에는 세가지 분류가 있다 1. 기본값 타입 2. 임베디드 타입 3. 컬렉션 타입 1. 기본값 타입 자바에서 흔히 사용하는 타입으로 자바 기본타입인 int, do..
*지연 로딩과 즉시 로딩 지연로딩과 즉시로딩을 알기 전에 프록시라는 것을 짚고 넘어가야 한다. *프록시 프록시의 의미는 앞에서 대신 무언갈 중계해준다. 정도의 느낌이다. 프록시 서버도 마찬가지의 매커니즘이다. 그럼 지연로딩과 즉시로딩에서 프록시는 어떤 역할을 할까? 말 그대로 로딩 즉 데이터를 읽어오는 과정을 중계해준다. 예를 들어서 Member 엔티티와 Team 엔티티가 있다고 가정해보자, 비지니스 로직상 Member에 있는 데이터들만 조회하거나 입력할텐데 Team까지 필요하진 않을 것이다. 그런데 @ManyToOne 혹은 @OneToOne 어노테이션에서는 em.find(Member.class, member.getId()); 를 하면 Member 테이블은 물론이고 Team까지 조인해서 값을 가져온다. ..
*상속관계 매핑 테이블을 설계하는것에 있어서 공통된 칼럼이 계속 등장하면 어떻게해야할까? 방법은 크게 세가지로 나눌 수 있다. 1. 한 테이블에 다 때려박는 SINGLE_TABLE 전략 2. 각 테이블에 중복되는 칼럼을 그냥 집어넣는 TABLE_PER_CLASS 전략 3. 슈퍼타입와 서브타입를 이용하는 JOINED 전략 *JOINED 전략 관계형 데이터베이스에는 상속관계라는 것이 없다. 하지만 비슷한 모델링이 있는데 바로 슈퍼타입 서브타입이다. 예를 들어서 앨범, 책, 영화 테이블에 각각 공통 칼럼인 이름과 가격을 슈퍼타입인 아이템 테이블에 다 담는 것이다. 그리고 서브타입인 앨범, 책, 영화에는 슈퍼클래스의 PK값을 PK,FK값으로 사용함으로써 추후에 서브타입를 찾으려 할때는 조인을 사용해서 찾을 수 ..