목록프로그래밍/JPA (26)
쌓고 쌓다
임의로 생성한 테이블은 다음과 같다. CREATE TABLE inquiry ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), title VARCHAR(255), content VARCHAR(255), reg_date DATETIME DEFAULT NOW() ) 앞전에 게시판 만들때는 서버(자바)에서 현재 시간을 MVC패턴의 서비스단에서 다음의 코드로 갱신을 시켜줬었다. poster.setRegdate(LocalDateTime.now()); 이번에는 reg_date 컬럼의 값은 DEFAULT로 DB에서 현재 시간을 넣어주는 방식을 생각했다. 아래의 JSON 데이터를 전송하여 서버에서 JPA를 사용하여 저장할 것이다. {"title": "title!",..
앱과 통신을 위한 REST API 서버를 만드는중이다.! UPDATE를 수행하는 메서드를 만들었다. 다음과 같다. @Service public class UserService { ... public User updateUser(Long id, User userInfo) { User user = userRepository.findById(id).get(); // Optional 수정 필요 String name = userInfo.getName(); int age = userInfo.getAge(); user.setName(name); user.setAge(age); return user; } } 아니!! find는 쿼리가 잘 날라가는데 아래의 엔티티 변경시 UPDATE 쿼리가 안날라간다. 문제는 트랜잭션내..
application.properties - jpa가 날리는 sql 보기 spring.jpa.show-sql=true 코드를 작성했는데 이상하게 SELECT 문이 나가는것이다... memberRepository.save(member); save시 INSERT 쿼리가 날라가고 SELECT 쿼리가 날라가는 것이다. 왜일까? save 메서드는 이미 존재하는 식별자 값이라면 이미 있는 엔티티로 판단해 merge를 한다. 만약 없는 식별자 값이라면 새로운 엔티티로 persist를 한다. 즉, 이미 존재하는 식별자 값이면. 변경 사항이 있다면 UPDATE하고 존재하지 않는 식별자 값이라면 INSERT한다. 한번 진짜 존재하는 엔티티 식별자가 있으면 UPDATE를 날리는지 보자. 현재 DB에 값이 존재한다. 이때 똑..
에러 발생 java.lang.IllegalStateException: Cannot call sendError() after the response has been committed org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion (StackOverflowError)] java.lang.StackOverflowError 보면 jackson 라이브러리에서 무한하게 에러 메시지를 보내면서 StackOverflow에러가 발생했다. 에러 원인 Poster @Entity @Getter @Setter public class Poster { @OneToMany(mappedB..
부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제할 수 있다. 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 된다. Parent @Entity @Getter @Setter public class Parent { ... @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST, orphanRemoval = true) private List child = new ArrayList(); } 아래의 코드를 수행하자. Parent parent = em.find(Parent.class, 12L); parent.getChild().remove(0); 자식 엔티티 삭제 쿼리가 날라간다. 고아 객체 제거는 참조가 제거된 엔티티가 어떤곳에서도 참조하..
부모와 자식 엔티티를 제거하려면 자식 엔티티를 하나씩 제거하고 부모 엔티티를 제거해야한다. 영속성 전이는 저장뿐만아니라 삭제도 가능하다. 부모 엔티티만 제거하면 자식 엔티티도 함께 제거하게 할 수 있는 것이다. Parent @Entity @Getter @Setter public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "parent", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private List child = new ArrayList(); } cascade = {CascadeType.PERSIS..
영속성 전이를 사용하면 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 영속성 전이를 사용하지 않았을때의 로직을 먼저 보자. 영속성 전이 사용 Parent @Entity @Getter @Setter public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List child = new ArrayList(); } cascade 속성에 CascadeType.PERSIST 값을 주면 된다. Child @Entity @Getter @Setter public cl..
JPA는 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 DB에서 조회하는것이 아니라, 실제 사용 시점에서 DB 조회를 한다. ( 자주 함께 사용하는 객체라면 두번 조회하는것보다 첨부터 조인 쿼리를 날리는게 효과적이다. ) 먼저. 회원, 팀 엔티티, 테이블 상황을 보자. Member @Entity @Getter @Setter @NoArgsConstructor public class Member { @Id private Long id; private String username; @ManyToOne @JoinColumn(name="team_id") private Team team; } Team @Entity @Getter @Setter @NoArgsConstructor public c..