1. User
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "user_tb")
@Getter
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
@CreationTimestamp
private Timestamp createdAt;
}
@Column
- 필드를 데이터베이스의 컬럼에 매핑한다.
unique
: 컬럼 값의 중복 여부를 설정하며, 고유 인덱스가 생성된다.nullable
: 컬럼이null
값을 허용할지 여부를 설정한다.
@CreationTimestamp
- 엔티티가 생성될 때, 해당 필드에 자동으로 현재 시간이 할당된다.
2. UserRepository
@RequiredArgsConstructor
@Repository
public class UserRepository {
private final EntityManager em;
public User findByUsername(String username) {
Query q = em.createQuery("select u from User u where u.username = :username", User.class);
q.setParameter("username", username);
try {
return (User) q.getSingleResult();
} catch (RuntimeException e) {
throw new RuntimeException("아이디 혹은 패스워드가 일치하지 않습니다.");
}
}
}
- 쿼리문을 작성하여
username
으로User
엔티티를 조회한다.
getSingleResult
메서드를 호출할 때, 결과를 없거나 여러 건일 경우 예외가 발생한다.
- 그러므로
try-catch
를 사용해 예외가 발생할 경우 사용자 정의 예외를 발생시킨다.
- 예외 처리를 리포지토리에서 수행하면 비즈니스 로직과의 경계가 모호해질 수 있으므로, 서비스 계층에서 처리하는 방식을 권장한다.
3. UserService
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
public User 로그인(UserRequest.LoginDTO loginDTO) {
User userPS = userRepository.findByUsername(loginDTO.getUsername());
if (!userPS.getPassword().equals(loginDTO.getPassword())) {
throw new RuntimeException("아이디 혹은 패스워드가 일치하지 않습니다.");
}
return userPS;
}
}
userRepository
의findByUsername
메서드를 호출하여User
객체를 반환받는다.
- 반환된 객체는 영속성 컨텍스트에서 관리되는 객체이므로, 클래스 이름 뒤에 "PS"를 붙이는 컨벤션을 사용하였다.
userPS
와loginDTO
의password
를 비교하여 일치하지 않을 경우 사용자 정의 예외를 발생시킨다.
4. UserController
@RequiredArgsConstructor
@Controller
public class UserController {
private final UserService userService;
private final HttpSession session;
@PostMapping("/login")
public String login(UserRequest.LoginDTO loginDTO) {
User sessionUser = userService.로그인(loginDTO);
session.setAttribute("sessionUser", sessionUser);
return "redirect:/";
}
@ResponseBody
@GetMapping("/test/auth")
public String testAuth() {
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
return "인증안됨";
}
return "인증됨 : " + sessionUser.getUsername();
}
}
private final HttpSession session;
- IOC에 있는 세션을 주입받는다.
login
메서드- 클라이언트로부터
x-www-form-urlencoded
타입으로loginDTO
를 받는다. userService
에서 처리된 후 반환된User
객체를 세션에 저장한다.
testAuth
메서드- 로그인이 정상적으로 되었는지 확인하기 위해 만들어졌다.
- 클라이언트가 세션에서
sessionUser
를 가져온다. sessionUser
가null
일 경우 "인증 안됨"을 반환하고, 그렇지 않으면 "인증됨 : 유저명"을 반환한다.
Share article