Spring Security 회원가입 구현 및 DB 연결

윤한영·2025년 6월 18일
1
post-thumbnail

앞선 [블로그]와 이어지는 글입니다.

이번에는 회원가입 로직을 구현해 보겠습니다.

  • 사용 스택
    • h2 데이터베이스
    • Spring Data JPA → mybatis

1. DB 연결

회원가입 로직을 구현하기 전에 DB를 먼저 연결하겠습니다.

영상에서는 AWS에 DB 서버를 만들어서 사용하셨는데 저는 로컬에서만 간단하게 개발하고 싶어 h2 데이터베이스를 사용했습니다.
[h2 데이터베이스 연결하는 방법]
데이터베이스 연결하는 방법은 링크 참고 부탁드립니다.


1️⃣ 설정 추가하기

/* 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
}

2️⃣ 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()
				…
	…
}

3️⃣ MyBatisConfig 클래스 설정 추가

/* MyBatisConfig 클래스 생성 */
@Configuration
@MapperScan(basePackages = "com.example.login.mapper")
public class MyBatisConfig {
	// 비어있는 상태로 두면 됩니다.
}


2. 비밀번호 암호화를 위한 Security Config 추가

/* SecurityConfig.java */
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
	return new BCryptPasswordEncoder();
}

Spring Security는 회원가입, 사용자 인증(로그인) 시 비밀번호에 대해 단방향 해시 암호화를 진행하여 저장되어 있는 비밀번호와 대조합니다.

Spring Security는 암호화를 위해 BCryptPasswordEncoder 클래스를 제공하고 해당 방식으로 처리할 것을 권장합니다.



3. 회원가입 로직

프로젝트의 전반적인 구조는 [유미개발자님 블로그]를 참고하여 개발하였습니다.

이 글에서 소스 코드를 줄줄이 적기에는 너무 내용이 길어지는 것 같아 핵심 코드나 공부한 코드들만 작성하도록 하겠습니다.😅

전체적인 소스 코드는 [깃허브]를 참고해 주시면 감사하겠습니다!

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>


4. 결과확인

0개의 댓글