앞선 [블로그]와 이어지는 글입니다.
이번에는 회원가입 로직을 구현해 보겠습니다.
회원가입 로직을 구현하기 전에 DB를 먼저 연결하겠습니다.
영상에서는 AWS에 DB 서버를 만들어서 사용하셨는데 저는 로컬에서만 간단하게 개발하고 싶어 h2 데이터베이스를 사용했습니다.
[h2 데이터베이스 연결하는 방법]
데이터베이스 연결하는 방법은 링크 참고 부탁드립니다.
/* application.yml */
spring:
application:
name: login
h2:
console:
enabled: true
path: /h2-console
datasource:
url: jdbc:h2:tcp://localhost/~/test
driver-class-name: org.h2.Driver
username: sa
password:
mybatis:
mapper-locations: classpath:/mapper/*.xml # xml 파일이 있는 경로
type-aliases-package: com.example.login.model # dto 클래스가 존재하는 경로
/* build.gradle */
dependencies {
...
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
runtimeOnly 'com.h2database:h2' // h2 Driver
}
SecurityConfig
클래스에서 회원가입 url 허용해주기회원가입 api url (ex: ”/joinProc”)를 모든 사용자에게 허용해 줍니다.
/* SecuriryConfig */
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
RequestMatcher h2ConsoleMatcher = PathRequest.toH2Console();
http
.authorizeHttpRequests((auth) -> auth
.requestMatchers("/", "/login", "/joinProc").permitAll()
…
…
}
MyBatisConfig
클래스 설정 추가/* MyBatisConfig 클래스 생성 */
@Configuration
@MapperScan(basePackages = "com.example.login.mapper")
public class MyBatisConfig {
// 비어있는 상태로 두면 됩니다.
}
/* SecurityConfig.java */
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder();
}
Spring Security는 회원가입, 사용자 인증(로그인) 시 비밀번호에 대해 단방향 해시 암호화를 진행하여 저장되어 있는 비밀번호와 대조합니다.
Spring Security는 암호화를 위해 BCryptPasswordEncoder
클래스를 제공하고 해당 방식으로 처리할 것을 권장합니다.
프로젝트의 전반적인 구조는 [유미개발자님 블로그]를 참고하여 개발하였습니다.
이 글에서 소스 코드를 줄줄이 적기에는 너무 내용이 길어지는 것 같아 핵심 코드나 공부한 코드들만 작성하도록 하겠습니다.😅
전체적인 소스 코드는 [깃허브]를 참고해 주시면 감사하겠습니다!
1️⃣ Controller, Service, Mapper
클래스 및 인터페이스 생성하기
본 글의 핵심인 비밀번호 암호화에 대한 내용을 작성해야 하기 때문에 Service
단 코드만 작성하겠습니다.
위의 SecurityConfig
클래스에서 Bean으로 등록한 BCryptPasswordEncoder
클래스를 가져와 DI 시켜주고
encode()
메서드를 통해 비밀번호를 암호화시켜 DB에 저장하겠습니다.
/* JoinService */
@Service
public class JoinService {
@Autowired
private JoinMapper mapper;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
public void joinProcess(UserInfo userInfo) throws Exception{
// 동일한 계정이 존재하는지 체크하는 로직
int count = mapper.countDuplicateId(userInfo);
if(count > 0) {
return "DUPLICATE_ID";
}
userInfo.setRole("ROLE_USER");
userInfo.setPassword(bCryptPasswordEncoder.encode(userInfo.getPassword())); // 비밀번호 암호화를 위한 로직 추가
mapper.save(userInfo);
return "OK";
}
}
해시 암호화를 하여 DB에 값을 저장하게 되면 아래처럼 값이 들어가게 됩니다.
2️⃣ xml
파일 생성하기
저는 프로젝트/src/resources/mapper/*.xml
경로로 생성하였습니다. [깃 확인]
Mapper 기본 코드만 남겨놓겠습니다. 추가로는 필요하신 쿼리를 작성하시면 될 것 같습니다.
/* JoinMapper */
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.login.mapper.JoinMapper"> // mapper 경로 맞춰주기
/* 필요하신 쿼리 작성하시면 됩니다. */
</mapper>