My Project/도서 관리 프로그램 (final project)

1일차 - 회원가입 화면 구성 , 회원가입 요청 처리

미로910 2024. 8. 27. 10:02
목표💡
1. 회원가입 화면 구성 (jsp)
2. 회원가입 요청 처리 

 

파일

 

signUp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
 <link rel="stylesheet" href="/css/signUp.css" type="text/css">
</head>
<body>
	<div class="signup-container">
	<h2>회원가입</h2>
	
	<form action="/user/test" method="post">
	
		<div class="form-group">
			<label for="loginId">아이디:</label>
			<input type="text" class="form-control" placeholder="loginId" id="loginId" name="loginId" required>
			
		</div>
				<div class="form-group">
			<label for="password">비밀번호:</label>
			<input type="password" class="form-control" placeholder="password" id="password" name="password" required>
		</div>
	 
				<div class="form-group">
			<label for="name">이름:</label>
			<input type="text" class="form-control" placeholder=" name" id="name" name="name" required>
		</div>
				<div class="form-phone">
			<label for="phone">전화번호:
		
			<select name="phone" >
			<option>010</option>
			<option>02</option>
			<option>031</option>
			<option>051</option>
		</select>
		- <input type="text" name="phone" size="5" required>
		- <input type="text" name="phone" size="5" required>
		</label>
			</div>
				<div class="form-group">
			<label for="zip">주소(우편번호):</label>
			<input type="text" class="form-control" placeholder=" zip" id="zip" name="zip" required>
		</div>
				<div class="form-group">
			<label for="email">이메일:</label>
			<input type="text" class="form-control" placeholder="email" id="username" name="email" required>
		</div>

		<input type="radio" name="gender" value="m" checked>남자
		<input type="radio" name="gender" value="f">여자
		<br><br>

		<div>
		<button type="submit" class="btn">회원가입</button>
		</div>
	</form>
</div>
</body>

</html>

 

signUpDTO
package com.library.bookwave.dto;

import com.library.bookwave.repository.model.User;
import com.library.bookwave.repository.model.UserDetail;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString

// 회원가입 DTO
public class SignUpDTO {
	
	private String loginId; // 아이디
	private String password;
	private String name;
	
	private String email; // 이메일
	private Boolean gender; // 성별 // 대문자, 소문자 구분!
	private String phone; // 전화번호
	private String zip; // 우편번호
	private String addr1; // 주소(시/도)
	private String addr2; // 주소(상세주소)
	
	public User toUser() {
		return User.builder()
				   .loginId(this.loginId)
				   .password(this.password)
				   .name(this.name)
				   .build();
	}
	
	public UserDetail detailUser() {
		return UserDetail.builder()
				  		 .email(this.email)
				  		 .gender(this.gender)
				  		 .phone(this.phone)
				  		 .zip(this.zip)
				  		 .addr1(this.addr1)
				  		 .addr2(this.addr2)
				  		 .build();
				  		 
	}
	

}

 

model -> User
package com.library.bookwave.repository.model;

import java.sql.Timestamp;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString

// user_tb
public class User {

	private Integer id; //
	private String loginId;
	private String socialId;
	private String password;
	private String name;
	private String role; 
	private boolean subscribe;
	private int wave;
	private int mileage;
	private int status; 
	private Timestamp createdAt;
	
	
	
}

 

model -> UserDetail
package com.library.bookwave.repository.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString

// user_detail_tb
public class UserDetail {
	
	private int userId;
	private String email;
	private Boolean gender;
	private String phone;
	private String zip;
	private String addr1;
	private String addr2;

}

 

SignUpRepository
package com.library.bookwave.repository.interfaces;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.library.bookwave.dto.SignUpDTO;
import com.library.bookwave.repository.model.User;
import com.library.bookwave.repository.model.UserDetail;

@Mapper
public interface SignUpRepository {
	
	public int createUser(User user);
	public User findById(String loginId);
	public int createUserDetail(Integer id ,UserDetail userDetail);
	public List<UserDetail> findAll();
	

}

 

user.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=" com.library.bookwave.repository.interfaces.SingUpRepository">

<insert id="createUser">
	insert into user_tb(login_id, password, name)
	values (#{loginId}, #{password}, #{name} )
</insert>

<select id="findById" resultType="com.library.bookwave.repository.model.User">
	select * from user_tb where login_id = #{loginId}
</select>

<insert id="createUserDetail">
	insert into user_datail_tb (user_id, email, gender, phone, zip, addr1, addr2)
	values (#{userId}, #{email}, #{gender}, #{phone}, #{zip}, #{addr1}, #{addr2} )
</insert>

<select id="findAll" resultType="com.library.bookwave.repository.model.UserDetail">
	select * from user_detail_tb
</select>

</mapper>

 

UserService
package com.library.bookwave.service;

import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

import com.library.bookwave.dto.SignUpDTO;
import com.library.bookwave.handler.exception.DataDeliveryException;
import com.library.bookwave.handler.exception.RedirectException;
import com.library.bookwave.repository.interfaces.SignUpRepository;
import com.library.bookwave.repository.model.User;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class UserService {

	private final SignUpRepository signUpRepository;
	// 암호화
	// private final PasswordEncoder passwordEncoder;

// 회원 가입 처리	
// 통합 메서드
	 public void registerUser(SignUpDTO signUpDTO) {
	        // 1. user_tb에 사용자 정보 저장
	        createUser(signUpDTO);

	        // 2. 저장된 사용자 정보 조회
	        User user = null;
	        try {
	        	// dto에서 loginId 가져오기
	        	String loginId = signUpDTO.getLoginId();
	        	// loginId로 User 객체 조회
	        	user = signUpRepository.findById(loginId);
	        	
	            if (user == null) {
	                throw new DataDeliveryException("사용자를 찾을 수 없습니다.", HttpStatus.NOT_FOUND);
	            }
//	            return user;
	        } catch (DataAccessException e) {
	            throw new DataDeliveryException("데이터베이스 오류로 사용자 조회에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	        } catch (Exception e) {
	            throw new RedirectException("알 수 없는 오류가 발생했습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	        }
//	        User user = findById(signUpDTO.getLoginId());

	        // 3. user_detail_tb에 사용자 상세 정보 저장
	        createUserDetail(user.getId(), signUpDTO);
	    }

	    /**
	     * 2. user_tb에 사용자 정보 삽입 메서드
	     *
	     * @param signUpDTO 사용자 정보가 담긴 DTO
	     */
	    private void createUser(SignUpDTO signUpDTO) {
	        try {
	            int result = signUpRepository.createUser(signUpDTO.toUser());
	            if (result != 1) {
	                throw new DataDeliveryException("회원가입에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	            }
	        } catch (DataAccessException e) {
	            throw new DataDeliveryException("데이터베이스 오류로 회원가입에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	        } catch (Exception e) {
	            throw new RedirectException("알 수 없는 오류가 발생했습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	        }
	    }

	    /**
	     * 3. user_tb에서 사용자 ID로 조회하는 메서드
	     *
	     * @param loginId 조회할 사용자의 로그인 ID
	     * @return 조회된 사용자 정보
	     */
	    private User findById(SignUpDTO dto) {
	        try {
	        	// dto에서 loginId 가져오기
	        	String loginId = dto.getLoginId();
	        	// loginId로 User 객체 조회
	        	User user = signUpRepository.findById(loginId);
	        	
	            if (user == null) {
	                throw new DataDeliveryException("사용자를 찾을 수 없습니다.", HttpStatus.NOT_FOUND);
	            }
	            return user;
	        } catch (DataAccessException e) {
	            throw new DataDeliveryException("데이터베이스 오류로 사용자 조회에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	        } catch (Exception e) {
	            throw new RedirectException("알 수 없는 오류가 발생했습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	        }
	    }

	    /**
	     * 4. user_detail_tb에 사용자 상세 정보 삽입 메서드
	     *
	     * @param userId    사용자 ID
	     * @param signUpDTO 사용자 상세 정보가 담긴 DTO
	     */
	    private void createUserDetail(Integer userId, SignUpDTO signUpDTO) {
	        try {
	            int result = signUpRepository.createUserDetail(userId, signUpDTO.detailUser());
	            if (result != 1) {
	                throw new DataDeliveryException("사용자 상세 정보 저장에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	            }
	        } catch (DataAccessException e) {
	            throw new DataDeliveryException("데이터베이스 오류로 사용자 상세 정보 저장에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
	        } catch (Exception e) {
	            throw new RedirectException("알 수 없는 오류가 발생했습니다.", HttpStatus.SERVICE_UNAVAILABLE);
	        }
	    }

}//

 

UserController
package com.library.bookwave.controller;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.library.bookwave.dto.SignUpDTO;
import com.library.bookwave.handler.exception.DataDeliveryException;
import com.library.bookwave.service.UserService;

import jakarta.servlet.http.HttpSession;

@Controller
@RequestMapping("/user") // 수정
public class UserController {
	
	private UserService userService;
	private final HttpSession session; // 이거 해주는 이유 찾아 보기
	
	// 로그인 , 회원가입 화면 요청 기능 추가
	
	public UserController(UserService service, HttpSession session) {
		this.userService = service;
		this.session = session;
	}
	
	/*
	 * 주소설계: http://localhost:8080/user/sign-up
	 */
	// 회원가입 화면 요청
	@GetMapping("/sign-up")
	public String signUpPage() {
		return "user/signUp";
	}
	
	// 회원가입 요청 처리
	// TODO Define 파일 생성 후 수정하기 
	@PostMapping("/sign-up")
	public String signUpProc(SignUpDTO dto) {
		System.out.println("");
		System.out.println("DTO:"+dto);
		if(dto.getLoginId() == null || dto.getLoginId().isEmpty()) {
			throw new DataDeliveryException("id를 입력해 주세요", HttpStatus.BAD_REQUEST);
		}
		
		if(dto.getPassword() == null || dto.getPassword().isEmpty()) {
			throw new DataDeliveryException("password를 입력해 주세요", HttpStatus.BAD_REQUEST);
		}
		
		if(dto.getName() == null || dto.getName().isEmpty()) {
			throw new DataDeliveryException("이름을 입력해 주세요", HttpStatus.BAD_REQUEST);
		}
		
		if(dto.getEmail() == null || dto.getEmail().isEmpty()) {
			throw new DataDeliveryException("email을 입력해 주세요", HttpStatus.BAD_REQUEST);

		}
		
		if(dto.getGender() == null) {
			throw new DataDeliveryException("성별을 선택해 주세요", HttpStatus.BAD_REQUEST);

		}
		
		
		if(dto.getPhone() == null || dto.getPhone().isEmpty()) {
			throw new DataDeliveryException("번호를 입력해 주세요", HttpStatus.BAD_REQUEST);
		}
		
		// 서비스 객체로 전달
		userService.registerUser(dto);
		
		
		
		return "redirect:/user/sign-in";
	}
	
	
	// 로그인 화면 요청
	@GetMapping("/sign-in")
	public String signInPage() {
		return "user/signIn";
	}
	
	// 로그인 요청 처리

}//

 

문제점
1. 쿼리 합치기 (JOIN 사용하지 않고 합치기)
2. @PostMapping에서 데이터가 컨트롤러로 넘어가지 않음
3. 주소 이동 시 오류 발생
4. 예외 처리 실행 안됨