스프링부트3 회원가입 로그인, 로그아웃 구현하기 - 회원 도메인 만들기
본문 바로가기

웹/Spring

스프링부트3 회원가입 로그인, 로그아웃 구현하기 - 회원 도메인 만들기

728x90
반응형

안녕하세요 놀이방 사장입니다.

 

저번 포스팅에서는 스프링 시큐리티에 대해 배웠습니다.

 

이제부터 스프링 시큐리티를 이용해 인증,인가 기능을 구현해보겠습니다.

 

전체적인 흐름은

회원정보를 저장할 테이블을 만들고 테이블과 연결할 도메인을 만든 다음 

이 테이블과 연결할 회원 엔티티를 만들고 회원 엔티티와 연결되어 데이터를 조회하게 해줄

리포지터리를 만든 후 마지막으로 스프링 시큐리티에서 사용자 정보를 가져오는

서비스를 만든다.

 

1. 의존성 추가하기

implementation('org.springframework.boot:spring-boot-starter-security');
implementation('org.thymeleaf.extras:thymeleaf-extras-springsecurity6:');
implementation('org.springframework.security:spring-security-test');

 

2. 엔티티 만들기

회원 엔티티와 매핑할 테이블의 구조

컬럼명 자료형 null허용 설명
id BIGINT N 기본키 일련번호, 기본키
email VARCHAR2(255) N   이메일
password VARCHAR2(255) N   패스워드(암호화하여저장)
created_at DATETIME N   생성일자
updated_at DATETIME N   수정일자

 

3. domain패키지에 User.java파일 생성 후 UserDetails 클래스를 상속하는 User클래스 만들기

package me.joyeonggyu.springbootdeveloper.domain;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.util.Collection;
import java.util.List;


@Table(name="users")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class User implements UserDetails {   //UserDetails를 상속받아 인증 객체로 사용
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    private Long id;

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

    @Column(name="password")
    private String password;

    @Builder
    public User(String email, String password, String auth){
        this.email = email;
        this.password = password;
    }

    @Override       //권한 반환
    public Collection<? extends GrantedAuthority> getAuthorities(){
        return List.of(new SimpleGrantedAuthority("user"));
    }

    //사용자 id반환
    @Override
    public String getUsername(){
        return email;
    }

    // 사용자의 패스워드 반환
    @Override
    public String getPassword(){
        return password;
    }

    //계정만료 여부 반환
    @Override
    public boolean isAccountNonExpired(){
        // 완료되었는지 확인하는 로직
        return true;    //ture -> 만료되지 않음
    }

    // 계정 잠금 여부 반환
    @Override
    public boolean isAccountNonLocked(){
        // 계정 잠금이 되었는지 확인하는 로직
        return true;        //true -> 잠금되지 않음
    }

    // 패스워드의 만료 여부 반환
    @Override
    public boolean isCredentialsNonExpired(){
        // 패스워드가 만료되었는지 확인하는 로직
        return true;    //true -> 만료되지 않음
    }

    //계정 사용 가능 여부 반환
    @Override
    public boolean isEnabled(){
        // 계정이 사용 가능한지 확인하는 로직
        return true;    //true -> 사용가능
    }
}

 

 

코드 설명)

User클래스가 상속한 UserDetails 클래스는 스프링 시큐리티에서 사용자의 인증 정보를 담아두는 인터페이스이다.

스프링 시큐리티에서 해당 객체를 통해 인증 정보를 가져오려면 필수 오버라이드 메서드들을 여러개 사용해야한다.

 

메서드 반환 타입 설명
getAuthorities() Collection<? extends GrantedAuthority> 사용자가 가지고 있는 권한의 목록을 반환한다.
현재 예제코드는 사용자 이외의 권한이 없기 때문에 user권한만 담아서 반환
getUsername() String 사용자를 식별할 수 있는 사용자 이름을 반환한다.
이때 사용되는 사용자 이름은 반드시 고유 해야함
현재 예제코드는 유니크속성이 부여된 이메일을 반환
getPassword() String 사용자의 비밀번호를 반환
이때 저장되어 있는 비밀번호는 암호화해서 저장한다.
isAccountNonExpired() boolean 계정이 만료되었는지 확인하는 메서드이다.
만료되지 않으면 트루반환
isAccountNonLocked() boolean 계정이 잠금되었는지 확인하는 메서드
만료되지 않으면 트루를 반환
isCredentialsNonExpired boolean 비밀번호가 만료되었는지 확인하는 메서드
만료되지 않으면 트루 반환
isEnabled() boolean 계정이 사용가능한지 확인하는 메서드
사용가능하다면 트루 반

 

 

4. 리포지터리 만들기

User엔티티에 대한 리포지터리 만들기

repository 디렉터리에서 UserRepository.java파일 생성

package me.joyeonggyu.springbootdeveloper.repository;

import me.joyeonggyu.springbootdeveloper.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email); //email로 사용자 정보를 가지고 온다.
}

 

 

앞에 설명한 것처럼 이메일로 사용자를 식별

이메일 = 사용자 이름

지금은 사용자 정보를 받기 위해 스프링 시큐리티가 이메일을 전달 받아야한다.

스프링 데이터 JPA는 메서드 규칙에 맞춰 메서드를 선언하면 이름을 분석해 자동으로 쿼리를 생성

findByEmail() 메서드는 실제 데이터베이스에서 밑에 쿼리를 실행

 

FROM

WHERE email = #{email}

 

자주 사용되는 쿼리 메서드 명명 규칙들

코드 설명 쿼리
findByname() "name"컬럼의 값 중 파라미터로 들어오는 값과 같은 데이터 반환 ...WHERE name = ?1
findByNameAndAge() 파라미터로 들어오는 값 중 첫번째 값은 "name" 컬럼에서 조회 두번째 값은 "age"컬럼에서 조회한 데이터를 조회 ...WHERE name?1 NAD age?2
findByNameOrAge() 파라미터로 들어오는 값 중 첫번째 값은 "name"컬럼에서 조회되거나 두번쨰 값이 "age"에서 조회되는 데이터 반환 ...WHERE name?1 OR age?2
findByAgeLessThan() "age"컬럼의 값 중 파라미터로 들어온 값보다 작은 데이터 반환 ...WHERE age < ?1
findByAgeGreaterThan() "age"컬럼의 값 중 파라미터로 들어온 값보다 큰 데이터 반환 ...WHERE age > ?1
findByName(Is)Null() "name"컬럼의 값 중 null인 데이터 반환 ...WHERE name IS NULL

 

 

이상으로 회원 도메인 만들기 포스팅을 마치겠습니다.!

반응형