Backend
home
🖋️

9일차

생성일
2024/07/21 14:00
태그
본 프로젝트는 “스프링부트 3 백엔드 개발자 되기” 서적을 참고하여 진행하였음

회원 도메인 만들기

의존성 추가하기
dependencies { ... 생략 ... // 스프링 시큐리티 사용하기 위한 스타터 추가 implementation 'org.springframework.boot:spring-boot-starter-security' // 타임리프에서 스프링 시큐리티 사용하기 위한 의존성 추가 implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' // 스프링 시큐리티를 테스트하기 위한 의존성 추가 implementation 'org.springframework.security:spring-security-test' }
Java
복사
회원 엔티티 만들기
Search
회원
컬럼명
자료형
null 허용
설명
VARCHAR(255)
N
이메일
VARCHAR(255)
N
패스워드(암호화하여 저장)
DATETIME
N
생성일자
DATETIME
N
수정일자
domain 패키지에 UserDetail 클래스를 상속하는 User 클래스 생성
package com.example.msblog.domain; import jakarta.persistence.*; 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 java.util.Collection; import java.util.List; @Table(name = "users") @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", updatable = false) 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 // 권한 반환, 사용자 이외의 권한이 없기 때문에 user 권한만 담아 반환 public Collection<? extends GrantedAuthority> getAuthorities() { return List.of(new SimpleGrantedAuthority("user")); } // 사용자의 패스워드 반환 @Override public String getPassword() { return password; } // 사용자 id를 반환 (고유값) @Override public String getUsername() { return email; } // 계정 만료 여부 반환 @Override public boolean isAccountNonExpired() { return true; // 만료되었는지 확인 (true -> 만료되지 않았음) } // 계정 잠금 여부 반환 @Override public boolean isAccountNonLocked() { return true; // 계정 잠금되었는지 확인 (true -> 잠금되지 않았음) } // 패스워드 만료 여부 반환 @Override public boolean isCredentialsNonExpired() { return true; // 패스워드가 만료되었는지 확인 (true -> 만료되지 않았음) } // 계정 사용 가능 여부 반환 @Override public boolean isEnabled() { return true; // true -> 사용 가능 } }
Java
복사
UserRepository 생성
package com.example.msblog.repository; import com.example.msblog.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로 사용자 정보를 가져옴 -> FROM users WHERE email = #{email} }
Java
복사
서비스 코드 작성
package com.example.msblog.service; import com.example.msblog.repository.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; // 사용자 정보 가져오는 UserDetailService 인터페이스 구현 @RequiredArgsConstructor @Service public class UserDetailService implements UserDetailsService { private final UserRepository userRepository; @Override public UserDetails loadUserByUsername(String email) { return userRepository.findByEmail(email) .orElseThrow(() -> new IllegalArgumentException(email)); // 사용자 정보 가져옴 } }
Java
복사