H2 데이터베이스에서 user 키워드가 예약어로 지정되어 있어서 user 테이블 생성이 안되기때문에
NON_KEYWORDS=USER
를 추가해준다.
spring.datasource.url=jdbc:h2:mem:test;NON_KEYWORDS=USER
각각의 멤버가 일반유저인지, 아니면 관리자인지 구분 할 수 있는 Role역할이 있어야 한다.
이를 구분하기 위해 com.shopping.study.constant 패키지에
Role.java(enum)를 추가한다.
public enum Role {
USER, ADMIN
}
회원가입 화면으로부터 넘어오는 가입정보를 담을 dto을 생성
@Getter
@Setter
public class UserFormDto {
private String name;
private String email;
private String password;
private String address;
}
회원정보를 저장하는 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;
}
}
public interface UserRepository extends JpaRepository<User, Long> {
//회원가입시 중복된 회원이 있는지 검사하기 위해서 이메일로 회원을 검사할 수 있도록 쿼리 메서드를 작성
User findByEmail(String email);
}
@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("이미 가입된 회원입니다.");
}
}
}
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);
}
}
테스트가 제대로 된거 확인할 수 있다!