본문 바로가기
Spring

[Spring] 회원가입(1)

by dong_seok 2023. 8. 6.

이번 홈페이지에서 제가 구현하기로 한 기능은 로그인, 회원가입입니다.
오늘은 먼저 회원가입에 대해서 다뤄보고자 합니다.

일단 이전에 스프링과 디비를 연결 해 두었으니 이제는 데이터를 저장할 테이블을 생성할 것입니다. 테이블을 디비에서 직접 생성해도 괜찮지만 Spring에서는 자동으로 테이블을 생성해주는 Annotation이 있습니다. @Entity를 이용하면 됩니다.

package com.example.demo.entity;

import javax.persistence.*;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class SiteUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false,unique = true)
    private String userid;

    @Column(nullable = false)
    private String password;

    @Column(nullable = false,unique = true)
    private String email;
}

이렇게 class를 @Entity로 지정해주면 디비에 이름이  SiteUser라는 테이블을 만들어주고 class에 선언된 내부변수들을 데이타 베이스의 테이블에 있는 컬럼과 동일하게 1:1로 매칭시켜줍니다. 위의 코드들을 가볍게 설명하고 넘어가도록 하겠습니다.

 

가장 중요하게 볼 것은 Id입니다. id는 @Id을 이용해서 PK값으로 지정해 주었고 @GeneratedValue(strategy = GenerationType.IDENTITY)을 사용해서 자동 생성 되도록 하였습니다.(DB가 알아서 AUTO_INCREMENT 해줌)

 

Id 이외의 내부변수들은 @Column을 이용해서 테이블에 컬럼을 생성해 주었습니다. Entity클래스에 정의된 모든 내부변수는 기본적으로 @Column을 포함하기 때문에 생략이 가능하지만 nullable과 unique를 설정해 주기 위해서 일부러 작성하였습니다. (id는 @Column을 사용하지 않았는데도 테이블에 컬럼이 생성된 이유)

 

위의 코드를 실행시켜 주면 아래와 같이 디비에 테이블이 만들어진 것을 볼 수 있습니다.

siteuser 테이블

테이블을 만들었으니 리포지터리를 만들어 보도록 하겠습니다. 리포지터리란 엔티티에 의해 생성된 데이터베이스 테이블에 접근하는 메서드들(예: findAll, save 등)을 사용하기 위한 인터페이스입니다. 데이터 처리를 위해서는 테이블에 어떤 값을 넣거나 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)가 필요합니다. 이 때 이러한 CRUD를 어떻게 처리할지 정의하는 계층이 바로 리포지터리입니다. 리포지터리를 사용하는 이유는 Entity만으로는 데이터베이스에 데이터를 저장하거나 조회 할 수 없기때문에 데이터 처리를 위해서는 실제 데이터베이스와 연동하는 JPA 리포지터리를 사용하는 것입니다.

 

 

아래와 같이 UserRepository 인터페이스를 만들었습니다.

package com.example.demo.repository;

import com.example.demo.entity.SiteUser;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<SiteUser, Long> {
    
}

JpaReposiory를 상속해주고 첫번째 매개변수에는 리포지터리의 대상이 되는 엔티티의 타입(SiteUser(class명)) , 두번째 매개변수에는 해당 엔티티의 PK의 속성 타입(Long)을 지정해주어야 합니다.

 

 

이제 UserService를 만들어줍니다.

package com.example.demo.service;

import com.example.demo.entity.SiteUser;
import com.example.demo.entity.UserRole;
import com.example.demo.repository.UserRepository;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

import javax.transaction.Transactional;
import java.util.Optional;

@RequiredArgsConstructor
@Service
@Transactional //로직 처리중 에러 발생시, 변경된 데이터를 로직을 수행하기 이전 상태로 콜백 시켜줍니다.
public class UserService {

    private final UserRepository userRepository;
    private final PasswordEncoder passwordEncoder;
    public SiteUser create(String username, String userid, String password , String email) {
        SiteUser user = new SiteUser();
        user.setUsername(username);
        user.setUserid(userid);
        user.setPassword(passwordEncoder.encode(password));
        user.setEmail(email);
        this.userRepository.save(user);//DB 저장
        return user;//
    }

}

UserService 에서는 UserRepository 를 사용하여 User 데이터를 생성하는 create 메서드를 추가했습니다. 이제 다른 파일에서 UserService를 임포트하고 create 함수를 사용하면 DB에 데이터를 저장 할 수 있게 되었습니다!

 

 

이후 내용은 다음 글에서 다루도록 하겠습니다.

'Spring' 카테고리의 다른 글

[Spring] 원시 타입(Primitive Type) vs 참조 타입(Reference Type)  (0) 2023.08.08
[Spring] 회원가입(2)  (0) 2023.08.06
[Spring] 개발환경  (0) 2023.08.05

댓글