목표💡
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. 예외 처리 실행 안됨
'My Project > 도서 관리 프로그램 (final project)' 카테고리의 다른 글
6일차 - 로그인 소셜 로그인 api 연결 (1) | 2024.09.09 |
---|---|
5일차 - 기본 로그인 완료 (0) | 2024.09.05 |
5일차 - 회원가입 주소 api 연결, 유효성 및 정규화 (0) | 2024.09.04 |
3~4일차 - 회원가입 ID 비동기 처리 완료 (0) | 2024.09.02 |
2일차 - 회원가입 요청 처리 완료 (0) | 2024.08.28 |