Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -363,4 +363,5 @@ gradle-app.setting

# End of https://www.toptal.com/developers/gitignore/api/windows,macos,git,java,maven,eclipse,intellij,gradle,netbeans,visualstudiocode

application.yaml
application.yaml
env.properties
11 changes: 11 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,21 @@ dependencies {
compileOnly 'org.projectlombok:lombok'
//runtimeOnly 'com.mysql:mysql-connector-j'

// h2
implementation 'com.h2database:h2'

// validation
implementation 'jakarta.validation:jakarta.validation-api:3.0.2'
implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final'

// spring security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'

// java mail sender
implementation 'org.springframework.boot:spring-boot-starter-mail'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
Expand Down
96 changes: 24 additions & 72 deletions src/main/java/apptive/devlog/auth/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
import apptive.devlog.auth.dto.UserSaveForm;
import apptive.devlog.auth.entity.User;
import apptive.devlog.auth.service.UserService;
import apptive.devlog.auth.session.SessionConst;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
Expand All @@ -23,112 +25,62 @@
public class UserController {
private final UserService userService;

/**
* login 진입 페이지
* @param model
* @return
*/
// 로그인 시 진입하는 user home
@GetMapping
public String loginHome(@SessionAttribute(name = SessionConst.LOGIN_USER, required = false) UserLoginForm loginUser, Model model){

// 세션 정보가 있으면 유저 정보 표기
if(loginUser == null){
return "users/home";
}
else{
model.addAttribute("userLoginForm", loginUser);
return "users/userHome";
}
public String loginHome(@AuthenticationPrincipal UserDetails userDetails, Model model){
model.addAttribute("user", userDetails);
return "users/userHome";
}

/**
*
* @param model
* @return
*/
// 회원가입
@GetMapping("/signup")
public String signupForm(Model model){
model.addAttribute("user", new User());
public String signupForm(Model model) {
model.addAttribute("user", new UserSaveForm());
return "users/signup";
}

/**
*
* @param form
* @param bindingResult
* @return
*/
@PostMapping("/signup")
public String signup(@Validated @ModelAttribute("user") UserSaveForm form, BindingResult bindingResult){
// 이메일 중복 체크
if(form.getEmail() != null){
if(userService.isEmailDuplicated(form.getEmail())){
bindingResult.rejectValue("email", "duplicated", "이미 가입된 이메일입니다.");
}
}

// 닉네임 중복 체크
if(form.getNickname() != null){
if(userService.isNicknameDuplicated(form.getNickname())){
bindingResult.rejectValue("nickname", "duplicated", "이미 사용 중인 닉네임입니다.");
}
}

// Validation
if(bindingResult.hasErrors()){
if(bindingResult.hasErrors()) {
log.info("errors = {}", bindingResult);

return "/users/home";
return "users/signup";
}

// 성공 로직
User user = new User(form);
User user = new User();
user.setEmail(form.getEmail());
user.setPassword(form.getPassword());
user.setName(form.getName());
user.setNickname(form.getNickname());
user.setBirth(form.getBirth());
user.setGender(form.getGender());
userService.signup(user);

return "redirect:/users/home";
}

/**
*
* @param model
* @return
*/
// 로그인
@GetMapping("/login")
public String loginForm(Model model){
model.addAttribute(new User());
model.addAttribute("user", new UserLoginForm());

return "users/login";
}

/**
*
* @param form
* @param bindingResult
* @return
*/
@PostMapping("/login")
public String login(@Validated @ModelAttribute("user") UserLoginForm form, BindingResult bindingResult, HttpServletRequest request){
// 1차 유효성 검사
if(bindingResult.hasErrors()){
public String login(@Validated @ModelAttribute("user") UserLoginForm form, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
log.info("errors = {}", bindingResult);

return "users/login";
}

// 로그인 처리
HttpSession session = request.getSession();
session.setAttribute(SessionConst.LOGIN_USER, form);

return "redirect:/main";
}

// 로그아웃
@PostMapping("/logout")
public String logout(HttpServletRequest request){
HttpSession session = request.getSession(false);

if(session != null){
session.invalidate();
}
return "redirect:/main";
}
}
1 change: 1 addition & 0 deletions src/main/java/apptive/devlog/auth/dto/UserLoginForm.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
@Data
public class UserLoginForm {

@NotBlank(message = "이메일은 필수입니다.")
@Email(message = "이메일 형식이 아닙니다.")
private String email;
@NotBlank
Expand Down
28 changes: 13 additions & 15 deletions src/main/java/apptive/devlog/auth/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import java.time.LocalDateTime;

@Entity
// springSecurity user 인증 정보와 테이블 겹쳐서 수정
@Table(name = "users")
@Getter @Setter
public class User {

Expand All @@ -34,30 +36,26 @@ public class User {

private Gender gender;

@Column(nullable = true)
private String role;

public User() {}

public User(String email, String password, String name, String nickname, LocalDate birth, Gender gender){
public User(String email, String password, String name, String nickname, LocalDate birth, Gender gender, String role){
this.email = email;
this.password = password;
this.name = name;
this.nickname = nickname;
this.birth = birth;
this.gender = gender;
this.role = role;
}

// 생성자 필요서 다시 생각해보기
public User(UserLoginForm form){
this.email = form.getEmail();
this.password = form.getPassword();
}

public User(UserSaveForm form){
this.email = form.getEmail();
this.password = form.getPassword();
this.name = form.getName();
this.nickname = form.getNickname();
this.birth = form.getBirth();
this.gender = form.getGender();
// role 기본 값 설정
@PrePersist
public void prePersist() {
if (this.role == null) {
this.role = "user";
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,9 @@

public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
Optional<User> findByName(String name);

boolean existsByEmail(String email);

boolean existsByNickname(String nickname);
}
36 changes: 30 additions & 6 deletions src/main/java/apptive/devlog/auth/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,56 @@
import apptive.devlog.auth.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.NoSuchElementException;
import java.util.Optional;

@Service
@Transactional
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;

public User signup(User user){
// 서비스에서 exception throw
if(isEmailDuplicated(user.getEmail())){
throw new IllegalArgumentException("중복된 이메일입니다.");
}
if(isNicknameDuplicated(user.getNickname())){
throw new IllegalArgumentException("중복된 닉네임입니다.");
}

return userRepository.save(user);
}

//로그인
public User login(String email, String password){
return userRepository.findByEmail(email)
.filter(m->m.getPassword().equals(password))
.filter(m -> m.getPassword().equals(password))
.orElse(null);
}

// 이메일 중복 체크
public boolean isEmailDuplicated(String email){
// 중복 체크

return false;
// 중복 체크 처리
return userRepository.existsByEmail(email);
}

// 닉네임 중복 체크
public boolean isNicknameDuplicated(String nickname){
// 중복 체크
return userRepository.existsByNickname(nickname);
}

public User getUser(String name){
Optional<User> user = userRepository.findByName(name);

return false;
if(user.isEmpty()){
throw new NoSuchElementException("해당 사용자는 존재하지 않습니다.");
}
else{
return user.get();
}
}
}
5 changes: 0 additions & 5 deletions src/main/java/apptive/devlog/auth/session/SessionConst.java

This file was deleted.

Loading