spring/게시판 api
Spring boot 게시판 API 서버 제작 (3) - 로그인 - create,update 시간 추가 & Repository 구현
얼킴
2023. 2. 17. 18:51
이번에는 Entity를 생성하고 변경하는 시간을 추가해보고, 이전 게시글에서 만들었던 Member와 Role에 대해서 Repository를 생성해보겠습니다.
EntityDate추가
먼저 생성 시간과 업데이트 시간을 담고있는 EntityDate 클래스를 생성해줍니다.
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public abstract class EntityDate {
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
@Column(nullable = false, updatable = false)
private LocalDateTime modifiedAt;
}
EntityDate는 인스턴스가 생성될 필요가 없기 때문에 추상 클래스로 선언했습니다.
@MappedSuperClass를 추가해서 EntityDate클래스를 다른 클래스에서 상속받게 되면 그 클래스에서는 createdAt 필드와 modifiedAt필드가 추가로 생성됩니다.
그리고 마지막으로 위 코드를 활성화 하기 위해서는 spring boot application에서 @EnableJpaAuditing 어노테이션을 추가해줘야합니다.
@SpringBootApplication
@EnableJpaAuditing
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
MemberRepository 추가
Member 엔티티에 대한 MemberRepository를 생성해보겠습니다.
public interface MemberRepository extends JpaRepository<Member, Long> {
Optional<Member> findByEmail(String email); //Optional은 조회 결과가 null인 경우를 대비해줌
Optional<Member> findByNickname(String nickname);
}
MemberRepository 테스트
추가한 MemberRepository를 검증 할 테스트코드를 작성해보겠습니다.
먼저 테스트 코드를 돌리기 위한 설정을 합니다.
@DataJpaTest // JPA 관련 구성만 로드하여 테스트
class MemberRepositoryTest {
@Autowired MemberRepository memberRepository; //Member
- Member 인스턴스를 생성하여 저장한 후, 저장된 인스턴스와 생성한 인스턴스의 필드 값이 일치하는지 확인하는 테스트입니다.
@Test
public void saveMemberTest(){
// given
String email = "test@test.com";
String password = "password";
String nickname = "test_nickname";
String username = "test_username";
Member member = new Member(email, password, username, nickname, null);
// when
Member savedMember = memberRepository.save(member);
// then
assertThat(savedMember).isNotNull();
assertThat(savedMember.getEmail()).isEqualTo(email);
assertThat(savedMember.getPassword()).isEqualTo(password);
assertThat(savedMember.getNickname()).isEqualTo(nickname);
assertThat(savedMember.getUsername()).isEqualTo(username);
}
- 이메일이 중복된 Member 인스턴스를 저장하려고 할 때, DataIntegrityViolationException 예외가 발생하는지 확인하는 테스트입니다.
@Test
void saveMemberWithDuplicateEmailTest() {
// given
String email = "test@test.com";
String password = "password";
String nickname = "test_nickname";
String username = "test_username";
Member member = new Member(email, password, username, nickname, null);
memberRepository.save(member);
// when
Member duplicateEmailMember = new Member(email, "new_password", "new_username","new_nickname", null);
assertThrows(DataIntegrityViolationException.class, () -> memberRepository.save(duplicateEmailMember));
}
- 마지막으로 닉네임이 중복된 Member 인스턴스를 저장하려고 할 때, DataIntegrityViolationException 예외가 발생하는지 확인하는 테스트입니다.
@Test
void saveMemberWithDuplicateNicknameTest() {
// given
String email1 = "test1@test.com";
String email2 = "test2@test.com";
String password = "password";
String nickname = "test_nickname";
String username1 = "test_username1";
String username2 = "test_username2";
Member member1 = new Member(email1, password, username1, nickname, null);
Member member2 = new Member(email2, password, username2, nickname, null);
memberRepository.save(member1);
// when, then
assertThrows(DataIntegrityViolationException.class, () -> memberRepository.save(member2));
}
궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.