I T H

[프로젝트] 9. 백엔드개발 - 회원가입 로직 (Week 2) 본문

Spring ArtGallery Project

[프로젝트] 9. 백엔드개발 - 회원가입 로직 (Week 2)

thdev 2024. 1. 23. 10:52

화면단 (프론트) 작업이 끝났으므로

이제는 백엔드 작업을 진행하기로 함. 

회원가입 백엔드 쪽 로직은 두가지로 구분

1. 회원가입 전 아이디 중복체크를 위해 사용자 테이블에서 아이디가 존재하는지 확인
2. 회원가입 데이터 저장 전 원문 패스워드를 암호화된 패스워드로 변경 후 데이터 테이블로 저장

 

* 패스워드 암호화 처리는 스프링 시큐리티에서 제공하는 기본 클래스를 사용함.

 

 

백엔드 폴더 구성은 아래와 같음.

1. 컨트롤러 (Controller)
화면에서 버튼 클릭 등의 이벤트로 URL 호출 시 매핑할 URL 경로 및 메소드를 지정 

2. 서비스 (Service)
데이터베이스 테이블 내 데이터 저장, 수정, 삭제 시 서비스 클래스를 호출하여 트랜잭션 처리를 하기 위함

3. 마이바티스 인터페이스 및 쿼리 매핑 xml (Mapper)
SQL 쿼리 매핑 및 메소드 구현 

4. 모델빈 (도메인) (model / domain)
데이터 저장 시 사용할 빈 클래스 생성 

 

 

[ RegisterController.java ] 

package kr.co.art.biz.register.web;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.co.art.biz.register.domain.UserInfo;
import kr.co.art.biz.register.persistence.RegisterMapper;
import kr.co.art.biz.register.service.RegisterService;

@Controller
@RequestMapping("/register")
public class RegisterController {
	
	@Autowired
	private RegisterMapper registerMapper;
	
	@Autowired
	private RegisterService registerService;
	
	@RequestMapping("")
	public String main() {
		return "register";
	}
	
	/**
	 * 아이디 중복 체크 
	 * (/register/findUserId)
	 * @return
	 */
	@RequestMapping("/findUserId")
	@ResponseBody
	public List<Map<String, Object>> findUserId(@RequestBody Map<String, Object> param) {
		List<Map<String, Object>> list = registerMapper.findUserId(param);
		
		return list;
	}
	
	/**
	 * 회원가입
	 * (/register/saveAccountInfo)
	 * @return
	 */
	@RequestMapping("/saveAccountInfo")
	@ResponseBody
	public Map<String, Object> saveAccountInfo(@RequestBody UserInfo param) {
		Map<String, Object> result = new HashMap<String, Object>();
		registerService.saveAccountInfo(param);
		
		result.put("success", true);
		return result;
	}
}

 

[ RegisterService.java ] 

package kr.co.art.biz.register.service;

import kr.co.art.biz.register.domain.UserInfo;

public interface RegisterService {
	// 회원가입
	void saveAccountInfo(UserInfo map);
}

 

[ RegisterServiceImpl.java ]

package kr.co.art.biz.register.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import kr.co.art.biz.register.domain.UserInfo;
import kr.co.art.biz.register.persistence.RegisterMapper;

@Service
public class RegisterServiceImpl implements RegisterService {

	@Autowired
	private RegisterMapper registerMapper;
	
	// spring security 에서 제공하는 기본 인코딩 정보를 사용 
	// applicationContext-security.xml 파일에 빈 등록
	@Autowired
	private PasswordEncoder passwordEncoder; // 패스워드 인코딩 정보 

	@Override
	public void saveAccountInfo(UserInfo userInfo) {
		
		String orgPassword = userInfo.getUserPw();
		String userId = userInfo.getUserId();
		String encPassword = initUserPassword(orgPassword, userId);
		
		System.out.println("encPassword : " + encPassword);
		
		userInfo.setUserPw(encPassword); // 암호화한 패스워드 정보로 교체
		
		registerMapper.saveAccountInfo(userInfo);
	}
	
	/*
	 * 원문 패스워드를 전달받아 암호화 처리
	 */
	private String initUserPassword(String orgPassword, String userId) {
        return passwordEncoder.encode(orgPassword);
    }

}

 

[ RegisterMapper.java ]

package kr.co.art.biz.register.persistence;

import java.util.List;
import java.util.Map;

import kr.co.art.biz.register.domain.UserInfo;

public interface RegisterMapper {
	
	// 중복 아이디 체크 
	List<Map<String, Object>> findUserId(Map<String, Object> params);
		
	// 회원가입
	void saveAccountInfo(UserInfo params);
	
}

 

[ RegisterMapper.xml ]

<?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="kr.co.art.biz.register.persistence.RegisterMapper">

	<select id="findUserId" resultType="hashmap" parameterType="hashmap">
		SELECT * 
		  FROM ART.ART_USER
		 WHERE 1=1
		   AND USER_ID = #{id}
	</select>
	
	<insert id="saveAccountInfo" parameterType="userInfo">
		INSERT INTO ART.ART_USER (
				USER_ID
			  , AUTH_TYPE
			  , USER_PW
			  , USER_NAME
			  , USER_SEX
			  , USER_PHONE
			  , USER_EMAIL
			  , USER_ADDR
			  , ZIP_CODE
			  , OUT_YN
			  , INPUT_DATETIME
		)
		VALUES (
			  #{userId}
			, #{authType}
			, #{userPw}
			, #{userName}
			, #{userSex}
			, #{userPhone}
			, #{userEmail}
			, #{userAddr}
			, #{zipCode}
			, 'N' -- default 
			, NOW()
		)
	</insert>
	
</mapper>

 

[ UserInfo.java ]

package kr.co.art.biz.register.domain;

/*
 * 회원가입 사용자 정보
 */
public class UserInfo {
	private String userId; // 사용자 아이디 
	private String authType; // 사용자 권한 (1: 일반사용자, 2: 관리자)
	private String userPw; // 패스워드 
	private String userName; // 성명 
	private String userSex; // 성별 (1: 남자, 2: 여자)
	private String userPhone; // 전화번호 
	private String userEmail; // 이메일 
	private String userAddr; // 주소 
	private String zipCode; // 우편번호 
	private String outYn; // 탈퇴여부 (Y: 탈퇴, N: 유지)
	
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getAuthType() {
		return authType;
	}
	public void setAuthType(String authType) {
		this.authType = authType;
	}
	public String getUserPw() {
		return userPw;
	}
	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserSex() {
		return userSex;
	}
	public void setUserSex(String userSex) {
		this.userSex = userSex;
	}
	public String getUserPhone() {
		return userPhone;
	}
	public void setUserPhone(String userPhone) {
		this.userPhone = userPhone;
	}
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
	public String getUserAddr() {
		return userAddr;
	}
	public void setUserAddr(String userAddr) {
		this.userAddr = userAddr;
	}
	public String getZipCode() {
		return zipCode;
	}
	public void setZipCode(String zipCode) {
		this.zipCode = zipCode;
	}
	public String getOutYn() {
		return outYn;
	}
	public void setOutYn(String outYn) {
		this.outYn = outYn;
	}
	
}

 

[ 완성된 화면 (View) ]