이전글 보기

https://aamoos.tistory.com/670

 

[Spring Jpa] 3. 게시판 만들기 - H2 Database 연결하기

이전글 보기 https://aamoos.tistory.com/669 [Spring Jpa] 2. 게시판 만들기 - bootstrap5 적용하기 이전글 보기 https://aamoos.tistory.com/668?category=856312 [Spring Jpa] 1. 게시판 만들기 - 프로젝트 설..

aamoos.tistory.com

 

목표

리스트를 보면 필요한 항목이 번호, 제목, 내용, 작성자, 등록 날짜, 조회수, 삭제 여부 정도가 있습니다. 계획은 게시판 기본적인 글등록을 다한후 파일업로드를 개발을 할 예정입니다. 지금은 파일 업로드를 제외하고 생성을 할려고 합니다. 작성자 같은경우도 현재 로그인이 개발이 안되어 있어서 사용자 테이블에 데이터를 하나 넣어놓고 등록시 그 사용자가 등록한걸로 개발을 하려고 합니다. 이번장에서는 서버가 올라올때 관리자 계정 하나 자동 insert, p6 spy설정을 해보겠습니다.

 

화면

 

연관관계

한명의 사용자가 여러개의 글을 쓸수 있으므로 1:N으로 연관관계로 정하였습니다.

 

Entity 생성

entity 패키지에 저번에 생성한 Test.class는 삭제하고 Board.java를 생성합니다.

 

Board.java

package jpa.board.entity;

import jpa.board.dto.BoardDto;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.time.LocalDateTime;

/**
 * packageName    : jpa.board.entity
 * fileName       : Board
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@EntityListeners(AuditingEntityListener.class)
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "board_id")
    private Long id;            //번호

    private String title;       //제목
    private String content;     //내용

    @CreatedDate
    private LocalDateTime regDate;     //등록 날짜

    @LastModifiedDate
    private LocalDateTime uptDate;     //수정 날짜

    private Long viewCount;     //조회수
    private String delYn;       //삭제여부

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    public Board update(String title, String content){
        this.title = title;
        this.content = content;
        return this;
    }

    public Board delete(String delYn){
        this.delYn = delYn;
        return this;
    }

    @Builder
    public Board(String title, String content, Member member){
        this.title = title;
        this.content = content;
        this.viewCount = 0L;
        this.delYn = "N";
        this.member = member;
    }
}
@ManyToOne은 기본 fetch type이 Eager이므로 Lazy로 초기화 하였습니다. 날짜가 자동으로 들어가게 @CreatedDate, @LastModifiedDate를 사용하였습니다. 연관관계의 키를 사용자 id로 설정하였습니다.

 

@CreatedDate, @LastModifiedDate 날짜가 null로 들어가는경우

https://aamoos.tistory.com/673

 

[Spring Jpa] @CreatedDate, @LastModifiedDate 날짜가 null로 들어가는경우

Application 파일에 @EnableJpaAuditing 추가 package jpa.board; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.sprin..

aamoos.tistory.com

 

 

Authority.java

package jpa.board.entity;

/**
 * packageName    : jpa.board.entity
 * fileName       : Authority
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */
public enum Authority {
    ROLE_USER, ROLE_ADMIN
}
사용자 한명당 권한은 한개만 가지게 설정하려고 합니다. jpa.board.entity 패키지에 Authority enum 파일을 생성합니다.사용자 권한을 지정한 enum 파일입니다.

 

 

Member.java

package jpa.board.entity;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;            //번호
    private String username;    //작성자
    private String password;    //비밀번호
    private String phoneNo;     //핸드폰번호
    private int age;         //나이

    @Column(name = "user_role")
    @Enumerated(EnumType.STRING)
    private Authority authority; //권한 [ROLE_USER, ROLE_ADMIN]

    @OneToMany(mappedBy = "member")
    private List<Board> boards = new ArrayList<>();

    @Builder
    public Member(String username, String phoneNo, int age, Authority authority){
        this.username = username;
        this.phoneNo = phoneNo;
        this.age = age;
        this.authority = authority;
    }
}
- 연관관계의 주인은 Many 쪽입니다. 그 반대편인 one은 연관관계의 주인의 거울인 mappedby를 선언합니다. 

 

 

올바른 entity 설계

https://aamoos.tistory.com/672

 

[Spring Jpa] 올바른 entity 설계

올바른 entity 설계 @Setter를 사용하지 않기 - 엔티티에서 setter를 쓰지않고 생성자를 통해 파라미터를 설정을 하는게 좋습니다. 프로젝트가 커짐에 따라 api도 많이 생겨날텐데 setter를 무분별하게

aamoos.tistory.com

 

 

Spring Data JPA 사용하기

jpa.board 패키지 밑에 repository 패키지를 만들고 MemberRepository 인터페이스를 생성합니다.

 

MemberRepository.java

package jpa.board.repository;

import jpa.board.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * packageName    : jpa.board.repository
 * fileName       : MemberRepository
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */
public interface MemberRepository extends JpaRepository<Member, Long> {
}

 

어플리케이션이 시작될때 사용자 정보 insert

- 현재 로그인, 회원가입이 개발이 안되어있어서 편의상 application이 동작될때 관리자 계정 하나를 insert를 하려고 합니다.

 

 

jpa.board 패키지 밑에 initDB.java를 생성합니다.

 

initDB.java

package jpa.board;

import jpa.board.entity.Member;
import jpa.board.repository.BoardRepository;
import jpa.board.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.transaction.Transactional;
import java.util.List;

import static jpa.board.entity.Authority.ROLE_ADMIN;

/**
 * packageName    : jpa.board
 * fileName       : InitDB
 * author         : 김재성
 * date           : 2022-08-01
 * description    :
 * ===========================================================
 * DATE              AUTHOR             NOTE
 * -----------------------------------------------------------
 * 2022-08-01        김재성       최초 생성
 */

@Component
@RequiredArgsConstructor
public class InitDB {

    private final InitService initService;

    @PostConstruct
    public void init(){
        initService.userDBInit();
    }

    @Component
    @Transactional
    @RequiredArgsConstructor
    static class InitService {

        private final MemberRepository memberRepository;
        private final BoardRepository boardRepository;
        public void userDBInit(){

            List<Member> memberList = memberRepository.findAll();
            if(memberList.size() == 0){
                Member member = Member.builder()
                        .username("관리자")
                        .phoneNo("010-1111-2222")
                        .age(29)
                        .authority(ROLE_ADMIN)
                        .build();
                //member 저장
                memberRepository.save(member);
            }
        }
    }
}
빌더 패턴을 사용해서 사용자 이름, 핸드폰번호, age 항목을 선택해서 값을 넣어준후 저장을 합니다. 지금은 패스워드는 필요 없으므로 설정하지 않았습니다.

 

 

파라미터를 보려고 하는데 현재 상태에서는 찍히는게 보이지가 않습니다. 파라미터를 보려면 p6spy 설정이 필요합니다.

 

p6spy 설정 방법

https://aamoos.tistory.com/422

 

[SPRING JPA] 쿼리 파라미터 로그 남기기

build.gradle에 해당 라인 추가 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.6' -> 개발에는 적용하기 괜찮은데 운영에 적용할때는 고민을 해봐야함, 성능상 로그를 남겨도 괜찮은가?

aamoos.tistory.com

 

한글이 깨지기는 하는데.. 파라미터가 찍히는것을 볼수있습니다.

 

db에도 정상적으로 값이 들어갔습니다. 다음장에는 게시판 테스트 코드를 만들어보면서 데이터가 정상적으로 들어가는지 확인해보겠습니다.

 

다음글보기

https://aamoos.tistory.com/674

 

[Spring Jpa] 5. 게시판 만들기 - 게시판 등록, 수정 테스트 파일 만들기

이전글 보기 https://aamoos.tistory.com/671 [Spring Jpa] 4. 게시판 만들기 - Entity 생성, 빌드패턴, P6 spy 설정 이전글 보기 https://aamoos.tistory.com/670 [Spring Jpa] 3. 게시판 만들기 - H2 Database..

aamoos.tistory.com

 

복사했습니다!