후라이
[Web 게시판] DB 설계 및 Entity 구성 본문
본래 만들고자 하는 동네별 커뮤니티 게시판을 개발하기 전에
웹 애플리케이션의 기본 소양을 파악할 수 있는 웹 게시판 만들어보기를 진행했었습니다.
1. DB 설계
우선, DB 설계입니다.
크게 3가지의 테이블로 나눠 User, Post, Comments로 구분했으며
위 ER 다이어그램을 통해 키값들을 파악하실 수 있을 겁니다.
DB 개발 환경으로 MySQL을 사용했구요, 위 테이블에 따라 임의의 test data를 넣어주었습니다.
created_date와 modified_date은 추후에 조정할 예정입니다..
Springboot에서는 우선 테이블에 맞게 Entity를 설계하는 과정을 제일 먼저 진행했습니다.
처음 프로젝트를 진행하면서 헷갈렸던 개념들을 정리하겠습니다!!
2. JPA 엔티티
객체 지향적인 방식으로 데이터베이스와 상호작용하기 위함입니다.
엔티티는 자바 클래스와 데이터베이스 테이블을 연결하는 역할을 하게 됩니다.
우리가 SQL로 DB에 직접적으로 값을 넣어줄 때는
INSERT INTO user (username, email) VALUES ('newUser', 'newUser@example.com');
이렇게 쓰곤 합니다.
그런데 지금 우리가 개발하고자 하는 자바 스프링 환경에서 저 SQL 값을 넣어주기 위해 JPA 엔티티를 사용하게 됩니다.
User user = new User();
user.setUsername("newUser");
user.setEmail("newUser@example.com");
entityManager.persist(user);
이렇게 entityManager.persist()를 호출하면 JPA가 자동으로 SQL INSERT 쿼리를 생성해서 데이터베이스에 값을 삽입하게 됩니다.
3. 엔티티와 관련된 어노테이션
@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue 어노테이션은 JPA에서 사용되는 어노테이션으로 기본 키(primary key)의 자동 생성 전략을 지정합니다.
주로 @Id 필드와 함께 사용되는데, @GeneratedValue는 데이터베이스에서 자동으로 값이 생성되도록 설정합니다.
strategy = GenerationType.IDENTITY는 IDENTITY 전략을 선택하는 방법입니다.
데이터베이스에서 기본 키 값이 엔티티를 삽입할 때마다 데이터베이스에서 자동으로 증가하여 할당됩니다.
실제 MySQL에서 AUTO_INCREMENT 속성이 있잖아요?
그 속성 컬럼처럼 ID 필드에 값이 입력되지 않으면 자동으로 증가하게 됩니다.
@Column(nullable = false, length = 30, unique = true)
private String username;
@Column 어노테이션은 JPA에서 제공되는 어노테이션으로, 데이터베이스 테이블의 열과 엔티티 클래스의 필드를 매핑할 때 사용됩니다. 주요 속성은 아래와 같습니다.
- name : 데이터베이스 테이블의 열 이름을 저장합니다.
- nullable : 열이 NULL 값을 허용할지 여부를 지정합니다.
- unique : 해당 열의 값이 유일해야 하는지의 여부를 설정합니다. DB에서 UNIQUE와 동일합니다.
- length : 열의 최대 문자열 길이를 지정합니다. (Default : 255)
- precision : 소수점 없는 숫자 또는 소수점 있는 숫자의 총 자릿수를 지정합니다.
- table : 열이 속한 테이블을 명시적으로 지정합니다. (다중 테이블 매핑 시 사용)
- columnDefinition : 데이터베이스에서의 열의 정의(SQL 타입)을 명시적으로 지정합니다.
@Column(columnDefinition = "integer defalut 0", nullable = false)
private int view;
@CreatedDate
@LastModifiedDate
@CreatedDate와 @LastModifiedDate도 Spring Data JPA에서 제공하는 어노테이션입니다.
엔티티의 생성 및 수정 시 자동으로 날짜와 시간을 기록하는 데 사용됩니다.
@CreatedDate : 엔티티가 처음 저장될 때의 날짜 및 시간을 자동으로 기록
보통 LocalDate, LocalDateTime, 또는 java.util.Date 타입의 필드에 사용됩니다.
@LastModifiedDate : 엔티티가 수정될 때마다 날짜 및 시간을 자동으로 기록합니다.
@CreatedDate와 같은 타입의 필드에 사용되고, 일반적으로 수정 일자, 마지막 변경 일자를 추적할 때 사용됩니다.
해당 어노테이션을 통한 속성 설정에는 보다 복잡한 방식이 요구됩니다. 다른 게시글에서 따로 다루겠습니다.
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="user_id)
private User user
어노테이션 이름만 봐도 일대다, 다대일 연관 관계를 로드하기 위한 JPA의 어노테이션임을 알 수 있을텐데요,
Fetch 방식이 궁금하여 찾아보았습니다.
FetchType.LAZY : 객체를 실제로 사용할 때만 데이터베이스에서 조회합니다.
FetchType.EAGER : 엔티티를 조회할 때 연관된 엔티티도 즉시 로드합니다.
@JoinColumn : 외래 키를 매핑하기 위한 설정입니다.
name 속성을 통해 외래 키로 사용할 테이블 컬럼명을 지정하게 됩니다.
@OneToMany(mappedBy = "post", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE)
@OrderBy("id asc")
private List<Comment> comments;
여기서 @OneToMany인 이유는 게시글 하나에 여러 개의 댓글이 달릴 수 있기 때문입니다.
mappedBy = "post"는 양방향 매핑에서 사용되는데, Comment 엔티티에서 Post와의 연관 관계를 정의하는 필드 이름을 지정합니다.
Comment 엔티티에서는
@ManyToOne
@JoinColumn(name = "post_id")
private Post post;
해당 부분이 포함되어 있어야 하며, mappedBy를 설정하면 현재 엔티티(post)가 관계의 주인이 아니며, 외래 키 관리는 Comment 엔티티가 담당하게 됩니다.
cascad = CascadeType.REMOVE : 부모 엔티티에서 발생한 작업(저장, 삭제)을 자식 엔티티에 전파하도록 설정합니다.
즉, Post가 삭제되면 연관된 모든 Comment도 삭제됩니다.
@OrderBy("id_asc") : id asc는 Comment 엔티티의 id 값을 기준으로 오름차순 정렬합니다.
'Spring' 카테고리의 다른 글
Spring security Config 설정 | Spring 3.xx version (0) | 2025.01.08 |
---|---|
[Thymeleaf] 타임리프 알아보기 (0) | 2024.12.27 |
[SpringMVC] Spring MVC 파헤치기 | 응답편 (2) | 2024.12.26 |
[SpringMVC] Spring MVC 파헤치기 | 요청편 (1) | 2024.12.26 |
[Spring MVC] MVC 프레임워크 <2> (1) | 2024.12.19 |