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));
    }

 


궁금한신점이나 잘못된 부분이 있으면 자유롭게 댓글 달아주세요.

github : https://github.com/jaeyeon423/spring_board_api