개발/부트캠프

본캠프 : 개인 과제(일정 관리 앱-Develop 만들기) 트러블 슈팅

EJ EJ 2025. 2. 13. 11:30

1. 개요

일정 관리 앱-Develop 만들기 과제를 진행하며, 겪은 이슈에 대한 정리 및 회고

 

2. 트러블 슈팅

(1) LoginFilter requestURI

 

● 배경

LoginFilter 구현 후 유저와 일정 CRUD 기능 테스트에서 401 에러 발생

 

● 발단

LoginFilter 클래스에서 WHIITE LIST에 과제 요구사항("회원가입, 로그인 요청은 인증 처리에서 제외합니다.")을 적용함

private static final String[] WHITE_LIST = {"/users/signup", "/users/login"};

 

● 전개

WHIITE LIST의 URI는 LoginFilter를 거치지 않고 다음 필터 또는 컨트롤러로 연결됨. 회원가입(/users/signup)과 로그인(/users/login)을 제외한 요청은 로그인 필터 로직이 실행되며 예외 처리됨

 

● 위기

WHIITE LIST에 유저와 일정 CRUD URI를 추가했으나, {id}를 조회하는 URI는 401 에러 발생

private static final String[] WHITE_LIST = {"/users/signup", "/users/login", "/users", "/users/{id}", "/schedules", "/schedules/{id}"};

 

● 절정

"/users/{id}"와 "/schedules/{id}"에서 {id}부분을 모든 경로가 올 수 있도록 *로 수정함

private static final String[] WHITE_LIST = {"/users/signup", "/users/login", "/users", "/users/*", "/schedules", "/schedules/*"};

 

● 결말

/{id}는 실행되지 않는다는 것을 알게됨, 우선 전체적인 CRUD Postman 테스트를 위해 /*로 처리하였지만 더 좋은 방안이 있을 것 같아

고민해 볼 예정

 

 

(2)  User 단건 삭제 시 Schedule 테이블에 해당 user_id 값이 존재할 경우

● 배경

User 단건 삭제에서 500 에러 발생함

 

Cannot delete or update a parent row: a foreign key constraint fails (`schedule`.`schedule`, CONSTRAINT `FKa50n59y1j4a6qwa42p8jiguds` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))

 

● 발단

User 테이블의 데이터를 삭제하려 했지만, 해당 user_id를 참조하는 데이터가 Schedule 테이블에 존재하여 삭제 실패함

 

● 전개

 

  • Schedule 테이블에서 user_id 컬럼이 User 테이블의 id를 참조(연결)하고 있음. 즉, Schedule 테이블에 해당 user_id 값이 존재하는 경우 User를 삭제할 수 없음
  • User 엔티티가 삭제되면, 해당 User를 참조하는 Schedule 엔티티도 처리해야 하지만 외래 키(FK) 제약 조건이 걸려 있어서 삭제되지 않음

첫번째 방법,

가장 쉬운 방법은 연관된 Schedule 데이터를 먼저 삭제한 후 User 삭제

 

● 위기

사용자의 불편함을 줄이고자 데이터를 먼저 삭제하지 않고도 User를 삭제함으로 연관된 Schedule 데이터를 자동으로 삭제하는 방법이 필요

 

● 절정

두번째 방법,

User 엔티티에서 CascadeType.REMOVE를 설정하면, User 삭제 시 관련된 Schedule도 자동으로 삭제됨.

@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE, orphanRemoval = true)

-> 하지만, 현재 프로젝트에서 요구사항은 일정 엔티티가 유저 고유 식별자 필드를 가지는 @ManyToOne으로 불가능.

@ManyToOne 관계에서 CascadeType.REMOVE를 적용 시 Schedule을 삭제할 때, 연관된 User도 삭제됨.

즉, Schedule을 삭제했을 뿐인데 사용자 계정인 User까지 삭제되는 심각한 오류 발생

 

세번째 방법,

외래 키 제약 조건을 ON DELETE CASCADE로 변경(DB 설정)하는 방법을 이용.

이 방법은 데이터베이스(MySQL)의 설정을 변경하는 방법으로, User를 삭제하면 해당 User의 id를 참조하는 모든 Schedule도 자동으로 삭제됨

 

(sql)

ALTER TABLE schedule 
DROP FOREIGN KEY FKa50n59y1j4a6qwa42p8jiguds, 
ADD CONSTRAINT FKa50n59y1j4a6qwa42p8jiguds
FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE;

 

● 결말

JPA 연관관계 설정에 대한 깊은 이해와 다양한 예제를 통한 문제 해결 방안을 배우고자함

 

3. 마무리

 이번 과제를 통해 배운 JPA 연관관계 설정과 설정 후에 CRUD를 리팩토링하는 과정에서 많은 고민을 함. 다음 주차에서는 다양한 변수와 예외를 생각하고 처리할 방법을 깊이 있게 모색할 예정