임베디드 예시문제

노건우·2023년 10월 11일
0

Spring

목록 보기
20/22

⭐ 사실 임베디드는 개발에 있어 매우 필수적인 요소라고 보기는 어렵다. 하지만 유지보수가 매우 간편하기에 임베디드를 쓸 수 있는 사람은 더욱 뛰어난 개발자라고 볼 수 있다. 개발은 돌아가는 것도 중요하지만 얼마나 유지보수가 용이한지, 얼마나 간단하게 코드를 짜 pc의 과부하를 막는지 등등 막무가내로 실행만 된다고 끝이 아니다.

Address

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가 필수

Member

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를 보여주는 사진이다.

period

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를 통해 보다 간단히 코드를 구성해냈다.

Main

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");
이 두 코드가 핵심

profile
초보 개발자 이야기

0개의 댓글

관련 채용 정보