⭐ 사실 임베디드는 개발에 있어 매우 필수적인 요소라고 보기는 어렵다. 하지만 유지보수가 매우 간편하기에 임베디드를 쓸 수 있는 사람은 더욱 뛰어난 개발자라고 볼 수 있다. 개발은 돌아가는 것도 중요하지만 얼마나 유지보수가 용이한지, 얼마나 간단하게 코드를 짜 pc의 과부하를 막는지 등등 막무가내로 실행만 된다고 끝이 아니다.
package com.codingbox.jpashop.embed;
import jakarta.persistence.Embeddable;
import lombok.Getter;
import lombok.Setter;
@Embeddable
@Getter
public class Address {
private String city;
private String street;
private String zipcode;
//테스트를 위해 파라미터가 있는 생성자
public Address(String city, String street, String zipcode) {
super();
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
public Address() {}
//setter를 없앤다
// public void setCity(String city) {
// this.city = city;
// }
//
// public void setStreet(String street) {
// this.street = street;
// }
//
// public void setZipcode(String zipcode) {
// this.zipcode = zipcode;
// }
}
@setter의 효과는 강력하다. 만일 이 어노테이션이 없다면
Address addrNew = new Address("newCity","강남","123");
member.setAddress(addrNew);
이런식으로 일일이 만들어야함.
즉 setter가 필수
package com.codingbox.jpashop.embed;
import java.time.LocalDateTime;
import jakarta.persistence.AttributeOverride;
import jakarta.persistence.AttributeOverrides;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter @Setter
public class Member {
@Id @GeneratedValue
private Long id;
private String username;
//기간
// private LocalDateTime startDate;
// private LocalDateTime endDate;
//@Embedded와 @Embeddable 둘 중에 하나만 넣어도 되는데 둘 다 넣는 것을 권장
@Embedded
private Period period;
//주소
@Embedded
private Address address;
// private String city;
// private String street;
// private String zipcode;
//회사주소
// @Embedded
// @AttributeOverrides({
// @AttributeOverride(name = "city", column = @Column(name="WORK_CITY")),
// @AttributeOverride(name = "street", column = @Column(name="WORK_STREET")),
// @AttributeOverride(name = "zipcode", column = @Column(name="WORK_ZIPCODE"))
// })
// private Address workAddress;
}
@Embeded어노테이션을 통해 Period 객체를 현재 엔티티에 내장하고 데이터베이스 테이블에 해당 멤버 변수를 추가할 수 있다.
전반적인 Member를 보여주는 사진이다.
package com.codingbox.jpashop.embed;
import java.time.LocalDateTime;
import jakarta.persistence.Embeddable;
import lombok.Getter;
import lombok.Setter;
@Embeddable
@Getter @Setter
public class Period {
private LocalDateTime startDate;
private LocalDateTime endDate;
//테스트를 위해 파라미터가 있는 생성자
public Period(LocalDateTime startDate, LocalDateTime endDate) {
super();
this.startDate = startDate;
this.endDate = endDate;
}
public Period() {}
}
address와 비슷하다. 이 객체는 @setter를 통해 보다 간단히 코드를 구성해냈다.
package com.codingbox.jpashop;
import java.time.LocalDateTime;
import java.util.List;
import com.codingbox.jpashop.embed.Address;
import com.codingbox.jpashop.embed.Member;
import com.codingbox.jpashop.embed.Period;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import jakarta.persistence.Persistence;
public class JpaMain5 {
public static void main(String[] args) {
EntityManagerFactory emf
= Persistence.createEntityManagerFactory("hello2");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Address addr = new Address("서울","강남","123");
Member member = new Member();
member.setUsername("user1");
member.setAddress(addr);
em.persist(member);
//기존 addr을 복사해서 새로운 객체를 만들어서 넣어주면 된다.
Address copyAddr = new Address(addr.getCity(),addr.getStreet(),addr.getZipcode());
Member member2 = new Member();
member2.setUsername("user2");
member2.setAddress(copyAddr);
em.persist(member2);
//user1사람의 city값을 newcity로 변경하고 싶다
// member.getAddress().setCity("new city");
Address addrNew = new Address("newCity","강남","123");
member.setAddress(addrNew);
tx.commit();
em.close();
emf.close();
}
}
제일 중요한 메인문이다. Address addr = new Address("서울","강남","123"); 이 코드만 활용한다면 ID1,2 모두 city값은 서울로 나올 것이다. 하지만 내가 한 컬럼 값을 바꾸고 싶다면 새롭게 객체를 생성해 넣어주면 된다.
Address copyAddr = new Address(addr.getCity(),addr.getStreet(),addr.getZipcode());
member.getAddress().setCity("new city");
이 두 코드가 핵심