- 프로젝트명 : "가시죠, 백오피스 만들기 프로젝트"
- 프로젝트 소개 : 사용자 Role에 따라 인가할 수 있는 관리자 기능을 만드는 프로젝트입니다.
- 사용 기술: #Java #Spring Boot #JPA #MySQL #Redis
GitHub: https://github.com/k-jaehyun/IForest.git
어제에 이어 오늘도 팀프로젝트를 진행했다.(x2)
계획했던 소셜로그인 기능을 구현하였고, 실질적인 백오피스(=관리자기능)을 추가하였다.
그 과정에서 새롭게 알게 된 것들 혹은 시도해본 것들은 다음과 같다.
(인터넷에 검색보면 이러한 내용이 검색된다.)
IT 분야에서 백오피스는 주로 조직이나 기업의 핵심 비즈니스 프로세스를 지원하고 관리하는데 사용되는 내부 시스템 및 서비스를 의미한다. IT 백오피스는 조직의 내부 운영에 필수적인 기술과 정보 시스템을 포함하며, 주로 프론트 오피스(front office)와 대조된다.
*프론트 오피스: 프론트오피스(Front Office)는 기업이나 조직에서 외부와 직접적으로 상호작용하는 부분을 가리키는 용어
핵심 단어는 지원과 관리이다.
이번 프로젝트에서의 백오피스는 '게시판 서비스를 지원하고 관리하는 관리자페이지 구성'이라는 개념으로 접근하였다.
그 예시로 네이버 블로그 백오피스를 가져왔다.
구체적으로는 이러한 기능들을 설계했다.
이전에 orphanremoval = true
옵션으로 해당 부모엔터티인 '게시글'이 삭제 될 때, 자식엔터티인 '댓글'까지 함께 삭제되도록 구현했었다.
그런데 이번엔 부모엔터티인 '유저'가 삭제되더라도 작성했던 자식엔터티인 '게시글'은 남아있도록 구현하고 싶어 공부해봤더니, @OnDelete 애노테이션이 있었다.
@OnDelete: Hibernate에서 사용되며, 관련 엔터티를 삭제할 때의 동작을 지정하는 데 사용
이중에서 내가 찾던 것은 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를 다뤄보는 것이라, 시행착오가 있었다.
우선 @Aspect 어노테이션으로 AOP를 만들었다.
@Pointcut으로 게시물 1개 조회하는 컨트롤러의 메서드를 입력했다.
그런데 문제는 어떻게 해당 게시글을 조회했는지 알아내는 것이었다.
그것은 바로 @PathVariable에 대해 args() 표현식을 활용하는 것!
코드에는 하나의 값만 받아오지만 args(.., pathVariable1, pathVariable2)
이렇게하면 여러개를 받아 올 수 있다.
받아온 값으로 메서드를 만들어서
@Before로 어느타이밍인지 결정
필요한 메서드(조회수+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를 만들기 위해 배운대로 활용 할 때는 머릿속이 어지러웠는데, 이렇게 글로 정리해보니 명확히 이해가 된다. 내일은 회원 차단, 공지글등록, 팔로우를 구현해보려한다.