header
<!DOCTYPE html>
<html lang="en">
<head>
<title>Bank</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/">Home</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#collapsibleNavbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="/join-form">회원가입</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/login-form">로그인</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">계좌목록</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">계좌생성</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">이체하기</a>
</li>
</ul>
</div>
</div>
</nav>
UserRequest
package com.metacoding.bankv1.user;
import lombok.Data;
public class UserRequest {
@Data //getter,setter,toString
public static class JoinDTO {
private String username;
private String password;
private String fullname;
}
@Data //getter,setter,toString
public static class LoginDTO {
private String username;
private String password;
}
}
UserController
package com.metacoding.bankv1.user;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@RequiredArgsConstructor
@Controller
public class UserController {
private final UserService userService;
@GetMapping("/login-form")
public String loginForm() {
return "user/login-form";
}
@GetMapping("/join-form")
public String joinForm() {
return "/user/join-form";
}
@PostMapping("/join")
public String join(UserRequest.JoinDTO joinDTO) {
userService.회원가입(joinDTO);
return "redirect:/login-form";
}
}
UserRepository
package com.metacoding.bankv1.user;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
@RequiredArgsConstructor // DI
@Repository
public class UserRepository {
private final EntityManager em;
public User findByUsername(String username) {
Query query = em.createNativeQuery("select * from user_tb where username = ?", User.class);
query.setParameter(1, username);
try {
return (User) query.getSingleResult();
} catch (Exception e) {
return null;
}
}
public void save(String username, String password, String fullname) {
Query query = em.createNativeQuery("insert into user_tb(username,password,fullname,created_at) values(?,?,?,now())");
query.setParameter(1, username);
query.setParameter(2, password);
query.setParameter(3, fullname);
query.executeUpdate();
}
}
UserService
오류는 터트리기
package com.metacoding.bankv1.user;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
@Transactional
public void 회원가입(UserRequest.JoinDTO joinDTO) {
// 1. 동일 username 있는지 검사 (조회)
User user = userRepository.findByUsername(joinDTO.getUsername());
// 2. 있으면 exception 터트리기
if (user != null) throw new RuntimeException("동일한 username이 존재합니다.");
// 3. 없으면 회원가입하기
userRepository.save(joinDTO.getUsername(), joinDTO.getPassword(), joinDTO.getUsername());
}
}
AccountController
package com.metacoding.bankv1.account;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class AccountController {
@GetMapping("/")
public String home() {
return "home";
}
}
join-form
❓이미 존재하는 username ‘ssar’을 입력하면?

⚠동일한 username이 존재해서 오류 발생

❓ 존재하지 않는 username ‘love’을 입력하면?

❗정상적으로 회원가입 되서 login page로 이동한다

❗h2-console에도 insert 확인 가능

Share article