[JPA] 게시글 작성자만 수정하게 하기(1)
본문 바로가기

Web 개발/게시판 만들기

[JPA] 게시글 작성자만 수정하게 하기(1)

728x90
반응형

💡 이전 내용

지난 글에서 게시글 작성 기능과 로그인 기능을 구현하였습니다.

이번글에서는 JPA Auditing 을 활용하여 게시글을 누가 작성했는지에 대한 정보를 저장하겠습니다.

작성자 정보를 저장하여 추후 작성자만 게시글을 수정하거나 삭제하는 기능을 구현하겠습니다.

 

📖 개념 정리

1. Auditing

Auditing를 활용하면 엔티티를 생성하거나 변경한 사람, 발생시점을 추적할 수 있습니다.

 

💻 구현

1. JPA Auditing 활성화 하기

@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
public class BoardApplication {

	public static void main(String[] args) {
		SpringApplication.run(BoardApplication.class, args);
	}

}

 

2. Base Entity 생성

모든 엔티티에 공통으로 적용하기 위해 Base Entity를 생성하겠습니다.

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class BaseEntity {

    @CreatedDate
    @Column(name = "created_date", updatable = false)
    protected LocalDateTime createdDate;

    @CreatedBy
    @Column(name = "created_by", updatable = false, columnDefinition = "nvarchar(4000)")
    protected String createdBy;

    @LastModifiedDate
    protected LocalDateTime lastModifiedDate;

    @LastModifiedBy
    @Column(name = "last_modified_by", columnDefinition = "nvarchar(4000)")
    protected String lastModifiedBy;

}
  • Base Entity는 단독으로 사용하지 않고, 다른 엔티티에서 상속을 받아 사용하기 위해  추상클래스로 생성하였습니다.
  • @MappedSuperclass 를 부모 클래스에 선언하면, 자식 클래스에서 부모의 속성을 상속받아 사용할 수 있습니다.
  • @EntityListeners를 선언하여  Persist, Remove, Update, Load에 대한 이벤트 발생 전, 후에 Auditing Listener를 콜백하도록 하였습니다.
  • @CreatedDate, @CreatedBy, @LastModifiedDate, @LastModifiedBy 어노테이션을
    생성일자, 생성자, 마지막 수정일자, 마지막 수정자 칼럼에 각각 매핑해줍니다.

 

3. 로그인한 사용자 정보 등록

AuditorAware 를 구현하여 로그인한 사용자의 정보를 받아옵니다.

여기서 받아온 사용자 정보는 @CreatedBy 와 @LastModifiedBy에 자동으로 매핑됩니다.

@Component
public class CustomAuditorAware implements AuditorAware<By> {

    @Override
    public Optional<By> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if(ObjectUtils.isEmpty(authentication) || !(authentication.getPrincipal() instanceof UserDetails)) {
            return Optional.empty();
        } else {
            CustomUserDetails customUserDetails = (CustomUserDetails) authentication.getPrincipal();
            return Optional.of(customUserDetails.getUsername());
        }
    }
}

 

4. BaseEntity 상속

Audit 기능을 사용할 엔티티에 상속받습니다.

@Getter
@NoArgsConstructor
@Entity
public class Board extends BaseEntity {
	...
}

 

 

 

참고 사이트

1. https://docs.spring.io/spring-data/jpa/docs/1.7.0.DATAJPA-580-SNAPSHOT/reference/html/auditing.html

2. https://mia-dahae.tistory.com/150

 

 

728x90
반응형