본문 바로가기
Framekwork/photogram

[스프링 부트 포토그램] 19강 인증 회원가입 - 완료

by 아이엠제니 2024. 9. 3.

IDE: IntetlliJ Ultimate
Spring Boot: 3.3.0
JDK: 17


 

 

 

 

💾 AuthController.java

> 강의

    @PostMapping("/auth/signup")
    public String signup(@Valid SignupDto signupDto, BindingResult bindingResult) {

            User user = signupDto.toEntity();
            User userEntity = authService.join(user);
            log.info("userEntity: {}", userEntity.toString());
            
            return "auth/signin";
    }

> 변경

    @PostMapping("/auth/signup")
    public String signup(SignupReqDto signupReqDto) { // key=value (x-www-form-urlencoded)
        User join = authService.join(signupReqDto);
        log.info("join: {}", join.toString());

        return "auth/signin";
    }

강의에서는 dto -> entity 변환하는 로직을 Controller에 작성하고 있다.

이 로직을 서비스 계층에서 처리하도록 변경했다.

 

컨트롤러 계층에서는 사용자로부터 입력받아 서비스 계층에 전달하는 역할을 하기 때문에!

로직은 서비스 계층에서 작업하는 것이, 추후에 유지보수하기에도 좋다고 본다.

 

 

 

💾 User.java

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Data
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 DB를 따라감
    private Long id;
.
.
.
    private LocalDateTime createdDate;

    @PrePersist
    public void createdDate() {
        this.createdDate = LocalDateTime.now();
    }
    
}
  • `@Bulder` 애노테이션 추가

 

 

 

💾 SignupReqDto.java

package org.example.photogram_re.web.dto.auth;

import lombok.Data;
import org.example.photogram_re.domain.user.User;


@Data // Getter, Setter
public class SignupReqDto {
    private String username;
    private String password;
    private String email;
    private String name;

    public User toEntity() {
        return User.builder()
                .username(username)
                .password(password)
                .email(email)
                .name(name)
                .build();
    }
}
  • `toEntity()` 메서드
    • dto를 entity로 변환

 

예전에 dto를 entity로 변환할 때는 setter 방식을 이용했었는데, 확실히 builder() 패턴이 작성도 쉽고 가독성이 좋은 것 같다.

 

 

 

💾 AuthService.java

package org.example.photogram_re.service;

import lombok.RequiredArgsConstructor;
import org.example.photogram_re.domain.user.User;
import org.example.photogram_re.domain.user.UserRepository;
import org.example.photogram_re.web.dto.auth.SignupReqDto;
import org.springframework.stereotype.Service;

@RequiredArgsConstructor
@Service // 1. IoC, 2. 트랜잭션 관리
public class AuthService {

    private final UserRepository userRepository;

    public User join(SignupReqDto signupReqDto) {
        return userRepository.save(signupReqDto.toEntity());
    }

}

`userRepository.java`를 객체에 담아 return 해도 되나, 로직이 비교적 단순하여 바로 return 했다.

 

 

 

💾 UserRepository.java

package org.example.photogram_re.domain.user;

import org.springframework.data.jpa.repository.JpaRepository;

// 애노테이션이 없어도 JpaRepository를 상속하면 IoC 등록이 자동으로 됨
public interface UserRepository extends JpaRepository<User, Long> {

}

 

여기까지 작성을 하면, 회원가입은 완료.

이 이후에는 비밀번호 해시와 동일 username으로 가입 불가 등의 기능이 추가될 예정이다.

 

 

 

이지업클래스 [메타코딩] 스프링부트 SNS프로젝트 - 포토그램 만들기 강의 실습

 

 

 

 

 

300x250