Published 2022. 8. 1. 18:23
이전글 보기
https://aamoos.tistory.com/670
목표
리스트를 보면 필요한 항목이 번호, 제목, 내용, 작성자, 등록 날짜, 조회수, 삭제 여부 정도가 있습니다. 계획은 게시판 기본적인 글등록을 다한후 파일업로드를 개발을 할 예정입니다. 지금은 파일 업로드를 제외하고 생성을 할려고 합니다. 작성자 같은경우도 현재 로그인이 개발이 안되어 있어서 사용자 테이블에 데이터를 하나 넣어놓고 등록시 그 사용자가 등록한걸로 개발을 하려고 합니다. 이번장에서는 서버가 올라올때 관리자 계정 하나 자동 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
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 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
한글이 깨지기는 하는데.. 파라미터가 찍히는것을 볼수있습니다.
db에도 정상적으로 값이 들어갔습니다. 다음장에는 게시판 테스트 코드를 만들어보면서 데이터가 정상적으로 들어가는지 확인해보겠습니다.
다음글보기
https://aamoos.tistory.com/674