Post

[Springboot] 포토그램 회원가입 기능 구현하기(1)


아이티윌의 국비지원 [스프링부트 SNS 포토그램 프로젝트] 강의를 수강하며 정리한 내용입니다.


오늘의 실습

  1. 회원가입 페이지 생성
  2. 회원가입 DTO 생성
  3. User 모델 생성
  4. 회원가입 Repository 생성
  5. 회원가입 Service 생성
  6. 회원가입 Controller 생성


🔎그 전에 알아야할 것


DTO(Data Transfer Object)란?

통신할 때 필요한 데이터를 담아주는 Object이다.
주로 비즈니스 객체와 데이터 전송 객체 간의 변환을 위해 사용된다. 예를 들어, DB로부터 조회한 엔티티 객체를 DTO로 변환하여 클라이언트에게 전달하거나, 클라이언트에서 전달한 데이터를 엔티티 객체로 변환하여 비즈니스 로직에 사용할 수 있다.

ORM(Object-Relational Mapping)이란?

기술적으로 애플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해준다.
즉, 데이터베이스와 직접 상호 작용하는 대신, 객체 모델을 통해 데이터베이스에 액세스할 수 있다. 이로써 개발자는 데이터베이스의 구체적인 구현 세부 사항을 신경 쓸 필요 없이 객체의 메서드를 호출하여 데이터를 조작할 수 있다.

Hibernate와 JPA(Java Persistence API)란?

대표적인 ORM 프레임워크로 Java의 Hibernate가 있다. Hibernate는 JPA 스펙의 구현체로, JPA를 사용하여 자바 애플리케이션에서 관계형 데이터베이스를 사용할 수 있도록 해준다.


실습


[1. 회원가입 페이지 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
<body>
        <div class="login__form">
            <!--회원가입 인풋-->
            <form class="login__input" action="/auth/signup" method="post">
                <input type="text" name="username" placeholder="유저네임" required="required" maxlength="30"/>
                <input type="password" name="password" placeholder="패스워드" required="required" />
                <input type="email" name="email" placeholder="이메일" required="required" />
                <input type="text" name="name" placeholder="이름" required="required" />
                <button>가입</button>
            </form>
            <!--회원가입 인풋end--> 
        </div>
</body>


[2. 회원가입 DTO]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.cos.photogramstart.web.dto.auth;

@Data // Getter와 Setter를 생성해줌
public class SignupDto {
    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() 메서드는 SignupDto 객체를 실제 사용자 엔티티(User 클래스)로 변환한다. DTO에 저장된 정보를 기반으로 새로운 사용자 엔티티를 생성하여 반환하며 이 때, User 엔티티의 빌더 패턴을 사용하여 쉽게 엔티티 객체를 생성한다.



[3. User 모델 생성]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.cos.photogramstart.domain.user;

@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity // DB에 테이블을 생성
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 번호 증가 전략이 데이터베이스를 따라간다.
    private int id;

    @Column(unique = true)
    private String username;
    private String password;

    private String name;
    private String website; // 웹사이트
    private String bio; // 자기소개
    private String email;
    private String phone;
    private String gender;

    private String profileImageUrl; // 사진
    private String role; // 권한

    private LocalDateTime createDate;
    
    @PrePersist // DB에 Insert 되기 직전에 실행
    public void createDate() {
        this.createDate = LocalDateTime.now();
    }
}

@Builder : 디자인패턴 중 빌더패턴 사용을 위한 어노테이션
@AllArgsConstructor : 모든 인자를 가진 생성자 생성
@NoArgsConstructor : 인자를 가지지 않은 기본 생성자 생성
@Entity : DB에 테이블을 생성해줌
@Id : entity에 대한 식별자 지정 (필수)
@GeneratedValue(strategy = GenerationType.IDENTITY) : 자동 번호 증가(사용하는 DB 전략을 따름)
@Column(unique = true) : 중복 불가능
@PrePersist : DB에 Insert 되기 직전에 실행



[4. 회원가입 Repository]

1
2
3
4
5
package com.cos.photogramstart.domain.user;

public interface UserRepository extends JpaRepository<User, Integer>{ // Object Type : User, Primary Key Type : Integer

}

JpaRepository는 Spring Data JPA에서 제공하는 기본적인 CRUD(Create, Read, Update, Delete) 기능을 지원한다.


첫 번째 제네릭 파라미터 User는 Repository가 다루는 엔티티 클래스, 두 번째 제네릭 파라미터 Integer는 해당 엔티티의 기본 키 타입이다. 여기서는 User 엔티티의 기본 키가 Integer 타입인 것으로 볼 수 있다.
JpaRepository를 상속하면 어노테이션이 없어도 IoC 등록이 자동으로 된다.



[5. 회원가입 Service]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.cos.photogramstart.service;

@RequiredArgsConstructor
@Service // 1. IoC 2. 트랜잭션 관리
public class AuthService {
    
    private final UserRepository userRepository;

    @Transactional
    public User 회원가입(User user) {
        // 회원가입 진행
        User userEntity = userRepository.save(user);
        return userEntity;
    }
}

@RequiredArgsConstructor : final 필드들의 생성자를 만들어 준다. 자바에서 전역변수에 final이 걸려있으면 생성자 혹은 객체가 만들어질 때 초기화가 필수이다.
@Service : 서비스 계층의 클래스를 빈으로 등록할 때 사용한다.
@Transactional : 함수가 실행된 후 종료될 때까지 트랜잭션 관리를 해준다. Write(Insert,Update, Delete)할 때 붙여준다. 넘어온 데이터를 레포지토리에 넣은 후 넣어진 값을 return하기 때문에 변수 명을 userEntity로 설정했다.



[6. 회원가입 Controller]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RequiredArgsConstructor // final 필드 DI
@Controller
public class AuthController() {

private final AuthService authService; 

@PostMapping("/auth/signup") // 단순히 회원가입 페이지 응답
public String signupForm() {
    return "auth/signup";
}

@PostMapping("/auth/signup") // 폼에 입력된 데이터를 받아와서 응답
public String signup(SignupDto signupDto) {
    // User <- SignupDto
    User user = signupDto.toEntity();
    authService.회원가입(user);

    return "auth/signin";
}
}




회원가입 기능은 완료되었지만 하나 부족한 게 있다. 회원가입 시 사용자의 인증 정보를 안전하게 보관하기 위해 비밀번호 암호화가 필수로 이루어져야 한다. 이는 [Spring]회원가입 기능 구현하기(2) - 비밀번호 암호화 참고!


This post is licensed under CC BY 4.0 by the author.