게시글을 작성할때 수정권한 등등을 확인하기 위해 게시글 작성시 member_id 가 와야합니다.
저는 아직 JPA,스프링 시큐리티 숙련도가 너무 부족해서 AuditConfig 사용할겁니다.
물론 AuditConfig 사용해서 중복이 없는 member_id 를 받아올수 있지만 저는 아직 숙련도가 부족해
이메일을 받아 올생각입니다.
AuditorAwareImpl
package cho.boardplus.confing;
import org.springframework.data.domain.AuditorAware;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.Optional;
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String userId = "";
if (authentication != null) {
userId = authentication.getName();
}
return Optional.of(userId);
}
}
- getCurrentAuditor() 메소드는 AuditorAware 인터페이스에서 정의된 메소드로, 현재 로그인한 사용자의 ID를 반환하는 역할을 합니다.
- Authentication 객체는 Spring Security에서 인증된 사용자 정보를 담고 있는 객체입니다. SecurityContextHolder.getContext().getAuthentication()은 현재 요청에 대한 Authentication 객체를 반환합니다. getName() 메소드는 Authentication 객체에서 현재 사용자의 이름을 반환합니다. 따라서 위 코드에서는 현재 로그인한 사용자의 ID를 구하기 위해 Authentication 객체에서 이름을 가져와서 userId 변수에 저장하고, 이를 Optional 객체에 담아 반환합니다.
AuditConfig
package cho.boardplus.confing;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class AuditConfig {
@Bean
public AuditorAware<String> auditorAware(){
return new AuditorAwareImpl();
}
}
- 스프링 데이터 JPA에서 사용하는 JPA Auditing을 구성하기 위한 설정 클래스입니다.
- @Configuration 어노테이션은 이 클래스가 스프링의 구성 설정임을 나타내고, @EnableJpaAuditing 어노테이션은 JPA Auditing을 사용하도록 활성화합니다.
- @Bean 어노테이션은 auditorAware()라는 메서드를 생성하고 AuditorAwareImpl 클래스의 인스턴스를 반환합니다. 이 클래스는 AuditorAware 인터페이스를 구현하고, 스프링 시큐리티에서 현재 사용자의 인증 정보를 가져와 createdBy와 modifiedBy 필드에 설정합니다.
- AuditConfig 클래스는 스프링 데이터 JPA에서 JPA Auditing을 사용하기 위한 설정 클래스로, createdBy와 modifiedBy 필드에 사용자 정보를 저장하기 위한 AuditorAwareImpl 클래스의 인스턴스를 반환하는 Bean을 생성합니다.
이제 Entity 도 약간 변화가 필요합니다.
BeseEntity
package cho.boardplus.entity;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Getter
@Setter
//시간 정보를 다루는 엔티티
public abstract class BaseEntity {
@CreatedBy
@Column(updatable = false)
private String createdBy; //작성시 회원 아이디 자동 체크
@LastModifiedBy
private String modifiedBy; // 수정시 회원 아이디 자동 체크
@CreationTimestamp //생성했을때 시간 체크
@Column(updatable = false) //수정시때는 발동하지 않는 옵션
private LocalDateTime createdTime;
@UpdateTimestamp //수정이 발생했을때 시간 체크
@Column(insertable = false) //인설트를 할때는 관여를 안한다.
private LocalDateTime updatedTime;
}
추상 클래스로 변경하고 createdBy , modifiedBy 를 추가합니다. 이전에 다른 Entity들은 다 BeseEntity를 상속받았습니다.
public class BoardEntity extends BaseEntity {
public class Member extends BaseEntity {
이제 게시글을 작성 하고 DB 를 확인 해보면 됩니다.
다시 한번 말하지만 중복이 없는 member_id 값을 created_by에 넣을수 있습니다. 제가 숙련도가 부족해서 일단은 이렇게 하고 넘어가는겁니다. AuditConfig 설정을 건들여서 수정하실수 있으면 수정하시고 진행하셔도 됍니다.
member_id 테이블을 연관맵핑을 하면서 시도했지만 저는 결국 실패해서 이렇게 합니다.
'Spring > 게시판 CRUD + 추가기능들' 카테고리의 다른 글
게시판 권한 부여 (0) | 2023.04.04 |
---|---|
로그인 구현 (0) | 2023.04.03 |
회원가입 기능 구현 (0) | 2023.04.01 |
게시글 페이징 (0) | 2023.03.30 |
게시판 삭제 (0) | 2023.03.29 |