Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

JAN's History

스프링과 JPA를 이용한 웹개발 프로젝트_엔티티 설계 본문

스프링

스프링과 JPA를 이용한 웹개발 프로젝트_엔티티 설계

JANNNNNN 2024. 4. 6. 11:24

만들어볼 프로그램은 Seed Starter 입니다.

레퍼런스

 

ERD 다이어그램(간략ver^_^)

Spring Project 생성하기!

https://start.spring.io/ 에서 아래 이미지대로 생성해주시기 바랍니다

 

Spring Web : Web을 사용할 것이기 때문에 필요

Thymeleaf : 자바 템플릿 엔진으로 타임리프를 사용할 것이기 때문에 필요

Spring Data JPA : JPA를 사용할 것이기 때문에 필요

MySQL Driver : DB를 MySQL로 사용할 것이기 때문에 필요

Lombok : getter, setter같은 스프링에서 자주 사용하는 어노테이션을 제공해주기 때문에 필요

➡️이후 Generater를 눌러 다운받고 압축파일을 풀어 인텔리제이에서 파일 내에 pom.xml을 열어주세요

잠깐! @SpringBootApplication에 대해 잠시 알아볼까요?

이미 알고있다면 넘어가도 좋습니다

@SpringBootApplication
public class SeedstarterApplication {

	public static void main(String[] args) {
		SpringApplication.run(SeedstarterApplication.class, args);
	}

}

pom.xml을 열면 기본세팅이 위와같이 되어있을텐데 @SpringBootApplication이 뭘까요?

SpringBootApplication.class를 열어보면 위와 같아요

여기서 가장 주목해야할 것은 @EnableAutoConfiguration, @ComponentScan 입니다!

@EnableAutoConfiguration:

  • @EnableAutoConfiguration 어노테이션은 Spring Boot에서 자동 구성을 활성화하는데 사용됩니다.
  • 즉, @EnableAutoConfiguration을 사용하면 자동으로 스프링이 클래스 메소드 위에 @Configuration과 @Bean을 넣어서 Bean으로 자동 등록해줍니다

@ComponentScan:

  •  @ComponentScan해당 패키지와 하위 패키지에서 @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스들을 스캔하여 스프링 애플리케이션 컨텍스트에 빈으로 등록합니다.

➡️ @ComponentScan이 해당 패키지와 하위 패키지까지 등록해주기 때문에, 해당 어노테이션이 붙은 패키지는 상위 패키지에 있어야합니다! 하위에 있는 애들이 자동으로 @ComponentScan의 대상이 되며 빈으로 등록되기 때문입니다

MVC 구조로 패키지 구성하기

repository와 entity를 같은 폴더에 두는 것도 고려해 볼만합니다

엔티티 설계 시작!

SeedStarter Entity

@Getter
@Setter
@Entity
public class SeedStarter {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "SEED_STARTER_ID")
    private Long id;
    
    private LocalDateTime datePlanted;
    private boolean covered;
    
    @Enumerated(EnumType.STRING)
    private Type type;
}

Type(Enum) class

public enum Type {
	PLASTIC, WOOD
}

SeedStarter에 Feature 리스트 추가

@Getter
@Setter
@Entity
public class SeedStarter {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "SEED_STARTER_ID")
    private Long id;
    private LocalDateTime datePlanted;
    private boolean covered;
    
    @Enumerated(EnumType.STRING)
    private Type type;
    @OneToMany(mappedBy = "seedStarter", cascade = CascadeType.PERSIST ,orphanRemoval = true)
     //CascadeType.PERSIST : 부모의 상태가 전이되는 것!
     //orphanRemoval = true:부모가 사라지면 자식도 함께 사라지는 것 true
     
    private List<Feature> features = new ArrayList<>();

Feature 엔티티

@Getter
@Setter
@Entity
public class Feature {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "FEATURE_ID")
    private Long id;
    @Enumerated(EnumType.STRING)
    private FeatureType name;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SEED_STARTER_ID")
    private SeedStarter seedStarter = new SeedStarter();
    
}

FeatureType(enum)

public enum FeatureType {
	SUBSTRATE, FERTILIZER, PH_CORRECTOR
}

SeedStarter에 Detail 리스트 추가

@OneToMany(mappedBy = "seedStarter", cascade = CascadeType.PERSIST, orphanRemoval = true)
private List<Detail> details = new ArrayList<>();

Detail 엔티티 설계

@Getter
@Setter
@Entity
public class Detail {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "DETAIL_ID")
    private Long id;
    private int rowNum;
    private int seedPerCell; //하나의 seed에 몇개에 cell이 있는지
    private String variety; //품종
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SEED_STARTER_ID")
    private SeedStarter seedStarter;
    
    }