domain
Member
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long Id;
@NotBlank
private String userId;
@NotBlank
private String password;
private String email;
@OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
private List<Board> boards = new ArrayList<>();
@Builder
public Member(String userId, String password, String email) {
this.userId = userId;
this.password = password;
this.email = email;
}
protected Member() {}
public void change(Member member) {
this.userId = member.getUserId();
this.password = member.getPassword();
this.email = member.getEmail();
}
}
- @NotBlank는 검증을 차후 검증을 위해 선언
- Member와 Board는 일대다 관계이기에 @OneToMany 선언
- FetchType.LAZY 지연로딩 설정
- 수정을 위한 메서드 change() 생성
Board
@Entity
@Getter @Setter
public class Board {
@Id
@GeneratedValue
@Column(name="board_id")
private Long id;
private String title;
private String content;
private LocalDateTime createdDate;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member member;
}
- Board와 Member는 다대일 관계이기에 @ManyToOne 선언
- FetchType.LAZY 지연로딩 설정
repository
MemberRepository
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findByUserId(String userId);
}
- JpaRepository 상속
- findByUserId() 생성
- MemberService에서 중복 아이디를 빠르게 찾기위해 생성하였다.
service
MemberService
@Service
@Transactional
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
public void createMember(Member member) {
validateDuplicateMember(member);
memberRepository.save(member);
}
public void deleteMember(Long memberId) {
memberRepository.delete(findOne(memberId));
}
public void updateMember(Member member) {
Member findMember = memberRepository.findById(member.getId()).orElseThrow(
()->{throw new NoSuchElementException("찾는 멤버가 존재하지 않습니다.");}
);
findMember.change(member);
}
@Transactional(readOnly = true)
public Member findOne(Long memberId) {
return memberRepository.findById(memberId).orElseThrow(
()->{throw new NoSuchElementException("찾는 멤버가 존재하지 않습니다.");}
);
}
@Transactional(readOnly = true)
public List<Member> findAll() {
return memberRepository.findAll();
}
public void validateDuplicateMember(Member member) {
Member findMember = memberRepository.findByUserId(member.getUserId());
if(findMember!=null) {
throw new IllegalStateException("이미 존재하는 아이디입니다.");
}
}
}
- CRUD 기능 구현
- 회원가입 시 중복된 아이디를 검증하는 로직 추가 (validateDuplicateMember)
Test
MemberServiceTest
@SpringBootTest
@Transactional
class MemberServiceTest {
@Autowired
MemberService memberService;
@Test
public void 생성() {
Member member1 = new Member("aa", "bb", "as");
memberService.createMember(member1);
Member findMember = memberService.findOne(member1.getId());
Assertions.assertThat(findMember).isEqualTo(member1);
}
@Test
public void 중복() {
Member member1 = new Member("aa", "bb", "as");
memberService.createMember(member1);
Member member2 = new Member("aa", "cc", "ab");
org.junit.jupiter.api.Assertions.assertThrows(IllegalStateException.class,
()->memberService.createMember(member2));
}
@Test
public void 삭제() {
Member member1 = new Member("aa", "bb", "as");
memberService.createMember(member1);
memberService.deleteMember(member1.getId());
org.junit.jupiter.api.Assertions.assertThrows(NoSuchElementException.class,
()->memberService.findOne(member1.getId()));
}
@Test
public void 수정() {
Member member1 = new Member("aa", "bb", "as");
memberService.createMember(member1);
member1.setPassword("cc");
memberService.updateMember(member1);
Member findMember = memberService.findOne(member1.getId());
Assertions.assertThat(findMember).isSameAs(member1);
}
}
'토이 프로젝트 > 게시판 프로젝트' 카테고리의 다른 글
6. 게시판 프로젝트 - 인터셉터 등록, 회원가입 폼 중복 ID 검증 (0) | 2022.08.10 |
---|---|
5. 게시판 만들기 - 회원가입 필드 오류 검증, PRG 패턴 (0) | 2022.08.09 |
4. 스프링 게시판 만들기 - 로그인 기능1(세션) , 필드 오류 검증 (0) | 2022.08.09 |
3. 스프링 게시판 만들기 - 컨트롤러 생성(Member), 회원가입 기능, 뷰 생성 (0) | 2022.08.09 |
1. 스프링 게시판 만들기 - 초기 설정 (0) | 2022.08.08 |