2024. 6. 25. 19:33ㆍ· LANGUAGE/└ Java
환경 : Spring Tool Suite 4, DBeaver
먼저, 암호화 연습을 위한 테이블 생성하겠다
create table secret_member(
member_id varchar2(20) primary key,
member_pw char(60) not null, /*비밀번호 값은 고정!!!!!*/
member_nick varchar2(30) not null unique
);
(+) 비밀번호는 Bcrypt 사용 시 60바이트로 고정!
encoder를 생성해 두고 가져다 쓰기위한 SecretConfiguration 파일을 생성한다
- SecretConfiguration.java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
public class SecretConfiguration {
@Bean
public BCryptPasswordEncoder encoder() {
return new BCryptPasswordEncoder();
}
}
DB와 연동을 위한 클래스 파일을 생성한다.
- SecretMemberDto.java
package com.kh.spring16.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public class SecretMemberDto {
private String memberId;
private String memberPw;
private String memberNick;
}
(+) Builder로 한 번에 데이터를 삽입할 수 있도록 도와줌!!!!!
코드와 데이터베이스를 연동해주기 위해 xml 생성한다
- secretMember-mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="secretMember">
<insert id="join">
insert into secret_member(member_id, member_pw, member_nick)
values(#{memberId}, #{memberPw}, #{memberNick})
</insert>
</mapper>
(+)DB에 데이터 삽입할 수 있는 용도
- SecretMemberDao.java
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Repository;
import com.kh.spring16.dto.SecretMemberDto;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Repository
public class SecretMemberDao {
@Autowired
private SqlSession sqlSession;
@Autowired
private BCryptPasswordEncoder encoder;
public void insert(SecretMemberDto secretMemberDto) {
//비밀번호를 암호화하여 재설정하는 코드
String origin = secretMemberDto.getMemberPw();//비밀번호 추출
String result = encoder.encode(origin);//암호화
secretMemberDto.setMemberPw(result);//비밀번호 재설정
sqlSession.insert("secretMember.join", secretMemberDto);
}
}
(+) 사용자가 입력한 비번을 bcrypt로 암호화하여 저장해줌~~
이제 테스트 해보자!
[ 회원가입 테스트 ]
- SecretMemberTest01.java
@Slf4j
@SpringBootTest
public class SecretMemberTest01 {
@Autowired
private SecretMemberDao secretMemberDao;
@Test
public void test() {
//회원가입 테스트
//SecretMemberDto memberDto = new SecretMemberDto();
//memberDto.setMemberId("testuser1");
//memberDto.setMemberPw("Testuser1!");
//memberDto.setMemberNick("테스트유저1");
SecretMemberDto secretMemberDto = SecretMemberDto.builder()
.memberId("testuser1")
.memberPw("Testuser1!")
.memberNick("테스트유저1")
.build();
//DAO를 이용한 가입처리
secretMemberDao.insert(secretMemberDto);
}
}
(+) 주석처럼 각각 필드마다 값을 삽입할 수 있지만, 한 번에 삽입할 수 있는 코드가 있다. (DTO에 적용한 어노테이션 덕분!!)
암호화 돼서 들어간 것을 확인할 수 있다!! good
[ 로그인 테스트 ]
DB에서 로그인한 회원의 정보를 찾기 위해 매퍼에 아이디로 정보 찾는 코드 추가 및 DAO 코드 추가
- secretMember-mapper.xml (id="find" 부분)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="secretMember">
<insert id="join">
insert into secret_member(member_id, member_pw, member_nick)
values(#{memberId}, #{memberPw}, #{memberNick})
</insert>
<select id="find" resultType="SecretMemberDto">
select * from secret_member where member_id = #{memberId}
</select>
</mapper>
- SecretMemberDao.java (로그인 정보 비교 코드 추가)
@Slf4j
@Repository
public class SecretMemberDao {
@Autowired
private SqlSession sqlSession;
@Autowired
private BCryptPasswordEncoder encoder;
public SecretMemberDto selectOne(String memberId) {
return sqlSession.selectOne("secretMember.find", memberId);
}
public SecretMemberDto selectOneByMemberPw(
SecretMemberDto secretMemberDto) {
//사용자가 입력한 아이디로 DB에서 정보를 조회
SecretMemberDto findDto = sqlSession.selectOne(
"secretMember.find", secretMemberDto.getMemberId());
//조회 결과가 없다면 아이디가 없는 것이므로 중단
if(findDto == null) return null;
//비밀번호를 "암호화" 고려하여 비교
boolean isValid = encoder.matches(
secretMemberDto.getMemberPw(), findDto.getMemberPw());
//isValid 결과에 따라 반환
return isValid ? findDto : null;
}
}
로그인 테스트 진행!!
- SecretMemberTest02.java
@Slf4j
@SpringBootTest
public class SecretMemberTest02 {
@Autowired
private SecretMemberDao secretMemberDao;
@Test
public void test() {
//로그인 테스트
SecretMemberDto secretMemberDto = SecretMemberDto.builder()
.memberId("testuser1")
.memberPw("Testuser1!df")
.build();
//로그인 판정
SecretMemberDto findDto =
secretMemberDao.selectOneByMemberPw(secretMemberDto);
log.debug("findDto = {}", findDto);
}
}
로그에 찍힌 결과를 확인 해보면,
맞게 작성한 경우 DTO 정보가 들어있고, 틀린 경우 null 값이 들어옴을 알 수 있다.
개인 공부 기록용입니다:)
'· LANGUAGE > └ Java' 카테고리의 다른 글
[ Java / Socket ] 서버/클라이언트 통신 및 토스트 메세지 띄워보기 (0) | 2024.06.29 |
---|---|
[ Java / Socket ] 웹 소켓 서버 생성 / 접속 / 접속종료 (0) | 2024.06.29 |
[ Java ] MimeMessage - 이메일 전송하기 (0) | 2024.06.25 |
[ Java / Mybatis ] Mybatis 사용해보기 (0) | 2024.06.22 |
[ Java ] 스프링에서 이메일 보내기 (JavaMailSenderImpl / MimeMessage) (0) | 2024.06.19 |