[스프링부트JPA] 쇼핑몰 회원가입 테스트

JEONG SUJIN·2023년 1월 26일
0
post-thumbnail

H2 데이터베이스에서 user 키워드가 예약어로 지정되어 있어서 user 테이블 생성이 안되기때문에

NON_KEYWORDS=USER를 추가해준다.

application-test.properties

spring.datasource.url=jdbc:h2:mem:test;NON_KEYWORDS=USER

각각의 멤버가 일반유저인지, 아니면 관리자인지 구분 할 수 있는 Role역할이 있어야 한다.
이를 구분하기 위해 com.shopping.study.constant 패키지에
Role.java(enum)를 추가한다.

Role.java

public enum Role {
	USER, ADMIN
}

UserFormDto.java

회원가입 화면으로부터 넘어오는 가입정보를 담을 dto을 생성

@Getter
@Setter
public class UserFormDto {
	
	private String name;
	
	private String email;
	
	private String password;
	
	private String address;
	
}

User.java

회원정보를 저장하는 User 엔티티를 생성

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.springframework.security.crypto.password.PasswordEncoder;

import com.shopping.study.constant.Role;
import com.shopping.study.dto.UserFormDto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
@AllArgsConstructor
@Data
@Table(name="user")
public class User {

	@Id
	@Column(name="user_id")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;
	
	private String name;
	
	//회원은 이메일을 통해 유일하게 구분해야 하기때문에 동일한 값이 데이터베이스에 들어올 수 없도록 unique속성 지정
	@Column(unique = true)
	private String email;
	
	private String password;
	
	private String address;
	
	/*
	 * 자바의 Enum타입을 엔티티의 속성을 지정할 수 있다. 
	 * Enum을 사용할 때 기본적으로 순서가 저장되는데, 
	 * enum의 순서가 바뀔 경우, 문제가 발생할 수 있으므로 "EnumType.STRING" 옵션을 사용해서 String으로 저장하기를 권장
	 * */
	@Enumerated(EnumType.STRING)
	private Role role;
	
	
	/*
	 * User엔티티를 생성하는 메서드
	 * 유저 엔티티에 회원을 생성하는 메서드를 만들어서 관리를한다면 
	 * 코드가 변경되더라도 한 군데만 수정하면 되는 이점이 있다. 
	 * */
	public static User createUser(UserFormDto userFormDto, PasswordEncoder passwordEncoder) {
		User user = new User();
		
		user.setName(userFormDto.getName());
		user.setEmail(userFormDto.getEmail());
		user.setAddress(userFormDto.getAddress());
		
		// 스프링 시큐리티 설정을 클래스에 등록한 BCryptPassword Bean을 파라미터로 넘겨서 비밀번호를 암호화
		String password = passwordEncoder.encode(userFormDto.getPassword());
		user.setPassword(password);
		user.setRole(Role.USER);
		
		return user;
	}
	
	
}

UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {

	//회원가입시 중복된 회원이 있는지 검사하기 위해서 이메일로 회원을 검사할 수 있도록 쿼리 메서드를 작성
	User findByEmail(String email);
}

UserService.java

@Service
@Transactional
@RequiredArgsConstructor
public class UserService  {

	private final UserRepository userRepository;
	
	public User saveUser(User user) {
		validateDuplicateUser(user);
		return userRepository.save(user);
	}
	
	//이미 가입된 회원일 경우 예외처리
	private void validateDuplicateUser(User user) {
		User findUser = userRepository.findByEmail(user.getEmail());
		
		if(findUser != null) {
			
			throw new IllegalStateException("이미 가입된 회원입니다.");
		}	
	}
	
}

UserServiceTest.java


import com.shopping.study.dto.UserFormDto;
import com.shopping.study.entity.User;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.test.context.TestPropertySource;
import org.springframework.transaction.annotation.Transactional;



import static org.junit.jupiter.api.Assertions.assertEquals;


@SpringBootTest
@Transactional
@TestPropertySource(locations="classpath:application-test.properties")
class UserServiceTest {

	@Autowired
	UserService userService;
	
	@Autowired
	PasswordEncoder passwordEncoder;
	
	public User createUser() {
		UserFormDto userFormDto = new UserFormDto();
		userFormDto.setName("정수진");
		userFormDto.setEmail("test@naver.com");
		userFormDto.setAddress("부산광역시  수영구");
		userFormDto.setPassword("1234");
		return User.createUser(userFormDto, passwordEncoder);
	}
	
	@Test
	@DisplayName("회원가입 테스트")
	public void saveUserTest() {
		User user = createUser();
		User savedUser = userService.saveUser(user);
	
		assertEquals(user.getName(), savedUser.getName());
		assertEquals(user.getEmail(), savedUser.getEmail());
		assertEquals(user.getAddress(), savedUser.getAddress());
		assertEquals(user.getPassword(), savedUser.getPassword());
		assertEquals(user.getRole(), savedUser.getRole());
		System.out.println("@@@@" + savedUser);	
	}
	
}

테스트가 제대로 된거 확인할 수 있다!

profile
기록하기

0개의 댓글