백오피스 만들기 프로젝트 (4): 백오피스란?, 유저 삭제, 게시물 조회수 기능

김재현·2023년 12월 8일
0

TIL

목록 보기
52/88
post-thumbnail
  • 프로젝트명 : "가시죠, 백오피스 만들기 프로젝트"
  • 프로젝트 소개 : 사용자 Role에 따라 인가할 수 있는 관리자 기능을 만드는 프로젝트입니다.
  • 사용 기술: #Java #Spring Boot #JPA #MySQL #Redis
    GitHub: https://github.com/k-jaehyun/IForest.git

어제에 이어 오늘도 팀프로젝트를 진행했다.(x2)

계획했던 소셜로그인 기능을 구현하였고, 실질적인 백오피스(=관리자기능)을 추가하였다.

그 과정에서 새롭게 알게 된 것들 혹은 시도해본 것들은 다음과 같다.

IT분야의 백오피스란?

(인터넷에 검색보면 이러한 내용이 검색된다.)

IT 분야에서 백오피스는 주로 조직이나 기업의 핵심 비즈니스 프로세스를 지원하고 관리하는데 사용되는 내부 시스템 및 서비스를 의미한다. IT 백오피스는 조직의 내부 운영에 필수적인 기술과 정보 시스템을 포함하며, 주로 프론트 오피스(front office)와 대조된다.

*프론트 오피스: 프론트오피스(Front Office)는 기업이나 조직에서 외부와 직접적으로 상호작용하는 부분을 가리키는 용어

핵심 단어는 지원관리이다.

이번 프로젝트에서의 백오피스는 '게시판 서비스를 지원하고 관리하는 관리자페이지 구성'이라는 개념으로 접근하였다.
그 예시로 네이버 블로그 백오피스를 가져왔다.

구체적으로는 이러한 기능들을 설계했다.

  • 유저에 대해: 전체 목록 조회, 롤 변경, 삭제, 차단,
  • 게시글, 댓글에 대해: 수정 및 삭제, 댓글 목록 조회

유저 삭제

이전에 orphanremoval = true 옵션으로 해당 부모엔터티인 '게시글'이 삭제 될 때, 자식엔터티인 '댓글'까지 함께 삭제되도록 구현했었다.
그런데 이번엔 부모엔터티인 '유저'가 삭제되더라도 작성했던 자식엔터티인 '게시글'은 남아있도록 구현하고 싶어 공부해봤더니, @OnDelete 애노테이션이 있었다.

@OnDelete: Hibernate에서 사용되며, 관련 엔터티를 삭제할 때의 동작을 지정하는 데 사용

@OnDelete의 옵션:

  • CASCADE: 관련 엔터티를 삭제할 때 연관된 엔터티도 함께 삭제.
  • NO_ACTION: 관련 엔터티를 삭제할 때 아무런 동작도 수행되지 않는다. 단, 외래 키 제약 조건이 있을 경우 삭제를 허용하지 않을 수 있음!
  • RESTRICT: NO_ACTION과 유사하게 동작하지만, 몇몇 데이터베이스에서는 차이가 있을 수 있다?
  • SET_DEFAULT: 관련 엔터티를 삭제할 때 외래 키 열의 값을 기본값으로 설정.
  • SET_NULL: 관련 엔터티를 삭제할 때 외래 키 열의 값을 NULL로 설정!!
  • SET_DEFAULT: 관련 엔터티를 삭제할 때 외래 키 열의 값을 기본값으로 설정.

이중에서 내가 찾던 것은 SET_NULL 이었고 다음과 같이 적용하여 원하는바를 이룰 수 있었다.

@Entity
@Getter
@NoArgsConstructor
public class Post extends Timestamped {


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

    @Column
    private String title;

    @Column
    private String content;

    @ManyToOne
    @JoinColumn (name = "user_name")
    @OnDelete(action = OnDeleteAction.SET_NULL)  // User 삭제시 Post의 User필드는 null이 되며 Post는 남아있게하는 옵션
    private User user;

    @OneToMany (mappedBy = "post", orphanRemoval = true) // 게시글 삭제시 댓글까지 함께 삭제
    private List<Comment> commentList = new ArrayList<>();

					...
            
}

게시물 조회수 기능

게시물 조회수 기능은 추후 다른 곳에 사용될 여지가 있으므로 AOP로 구현했다.

간단했지만 처음 AOP를 다뤄보는 것이라, 시행착오가 있었다.

  1. 우선 @Aspect 어노테이션으로 AOP를 만들었다.

  2. @Pointcut으로 게시물 1개 조회하는 컨트롤러의 메서드를 입력했다.

그런데 문제는 어떻게 해당 게시글을 조회했는지 알아내는 것이었다.

args() 표현식

그것은 바로 @PathVariable에 대해 args() 표현식을 활용하는 것!
코드에는 하나의 값만 받아오지만 args(.., pathVariable1, pathVariable2) 이렇게하면 여러개를 받아 올 수 있다.

  1. 받아온 값으로 메서드를 만들어서

  2. @Before로 어느타이밍인지 결정

  3. 필요한 메서드(조회수+1)를 만들었다.

@Aspect
@Component
@RequiredArgsConstructor
public class PostViewCounter {

    private final PostService postService;

    @Pointcut("execution(public * com.sparta.iforest.post.PostController.getPost(..)) && args(postId)")
    public void viewPostExecution(Long postId) {}

    @Before("viewPostExecution(postId)")
    public void afterViewPostExecution(Long postId) {
            postService.incrementViewCount(postId);
    }
}

AOP를 만들기 위해 배운대로 활용 할 때는 머릿속이 어지러웠는데, 이렇게 글로 정리해보니 명확히 이해가 된다. 내일은 회원 차단, 공지글등록, 팔로우를 구현해보려한다.


관련 포스팅

Previouse Post

Following Post

profile
I live in Seoul, Korea, Handsome

0개의 댓글