학교 프로젝트 중 서버 구현을 자바 스프링으로 해야하는 프로젝트가 있어서 스프링을 공부하게 되었습니다. 오늘은 스프링을 사용하여 회원가입을 구현한 것을 보여드리겠습니다. 그전에, DB연동이나 프로젝트를 시작하는 부분은 다음에 소개해드리겠습니다.
entity는 연동된 DB와 매핑되는 자바클래스를 말하는데, 모델이라고 보면 됩니다.
@Entity
@Table
@Getter
@Setter
public class User {
@Id
@Column(name = "user_id", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 50)
private String name;
@Column(nullable = false, length = 100)
private String password;
}
이런식으로 간단한 유저 entity를 만들었습니다.
id부분에 GeneratedValue는 자동으로 1씩 증가하는 id를 넣어주는 것입니다.
그다음은 UserRepository를 만들어줍니다.
repository는 entity로 만들어진 DB 테이블의 접근하기 위한 인터페이스라고 보면 된다.
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
실제 DB와 연결하기 위해서 JapRepository가 필요하고 상속 받을 때,
<entity class 이름, id의 자료형> 이런식으로 상속을 받으면 됩니다.
그다음은 UserService를 만들어줍니다.
service가 필요한 이유는,
1. 모듈화
-서비스를 따로 만들지 않고 컨트롤러에 모든 걸 만든다면, 동일한 기능을 중복으로 만들어야 할 수 있습니다. 그렇기 때문에 서비스를 사용합시다.
2.보안
-컨트롤러에서 리포지토리를 바로 접근하는 것이 보안상 위험할 수 있기 때문에 서비스를 사용합니다.
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
public User create(String name, String password) {
User user = new User();
System.out.println(name + " " + password);
user.setName(name);
user.setPassword(passwordEncoder.encode(password));
this.userRepository.save(user);
return user;
}
}
이런식으로 UserRepository를 사용해서 DB에 저장하는 방식입니다.
그런데 위 코드에서 비밀번호를 encode 즉, 암호화하는 내용이 나오는데, 이걸 위해 SecurityConfig라는 클래스를 만들어 줍시다.
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/**").permitAll()
.and()
.csrf().disable();
;
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위의 filterChain은 csrf허용 관련 내용들입니다.
밑에 passwordEncoder부분이 비밀번호 암호화 관련 내용입니다.
자 이제 UserCreateForm을 만들어 줄 것입니다.
@Getter
@Setter
public class UserCreateForm {
@Size(min = 3, max = 25)
@NotEmpty(message = "사용자ID는 필수항목입니다.")
private String name;
@NotEmpty(message = "비밀번호는 필수항목입니다.")
private String password1;
@NotEmpty(message = "비밀번호 확인은 필수항목입니다.")
private String password2;
}
이렇게 필요한 받을 데이터 양식에 따라 CreateForm을 만들어줍니다.
size부분은 말 그대로 3에서 25의 크기를 가져야 한다는 말입니다.
이제 마지막으로 UserController를 만들어 줄 것입니다.
@RequiredArgsConstructor
@Controller
@RequestMapping("/user")
public class UserController {
private final UserService userService;
@PostMapping("/signup")
@ResponseBody
public String signup(@Valid UserCreateForm userCreateForm, BindingResult bindingResult) {
System.out.println(userCreateForm.getName());
System.out.println(userCreateForm.getPassword1());
if (bindingResult.hasErrors()) {
return "error";
}
if (!userCreateForm.getPassword1().equals(userCreateForm.getPassword2())) {
bindingResult.rejectValue("password2", "passwordInCorrect",
"2개의 패스워드가 일치하지 않습니다.");
return "패스워드가 일치하지 않습니다.";
}
userService.create(userCreateForm.getName(), userCreateForm.getPassword1());
return "회원가입 성공!";
}
}
이렇게 controller에서 UserService의 create함수를 사용해서 회원가입을 해주면 완성!!
마지막으로 제가 추가한 dependency를 보여드리겠습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'mysql:mysql-connector-java'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.seleniumhq.selenium:selenium-java:4.4.0'
implementation 'org.seleniumhq.selenium:selenium-devtools-v104:4.4.0'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}
관련없는 것들도 있습니다..ㅎ
이렇게해서 스피링으로 회원가입 만들어 보았습니다.
저도 처름이라 모르는 내용도 많습니다..ㅎ
이해 부탁드리며
많은 분들이 참고하셨으면 좋겠습니다!!