01-08 TIL

거북·2024년 1월 8일

TIL

목록 보기
19/22

요약

진행중인 최종 프로젝트를 각자 구현한 곳까지 병합해서 테스트를 진행해 보고 그 과정에서 발생한 문제점을 해결하였다. 이후엔 구현해야할 남은 부분 개발을 진행했다.

기술면접

RDBMS의 정규화란

데이터의 유지보수성을 향상시키기 위해서 테이블을 효율적으로 분해하는 것으로 다음 단계를 걸칩니다.

  • 제 1 정규화 : 테이블의 칼럼이 하나의 값을 갖도록 분해하는 것
  • 제 2 정규화 : 부분 함수 종속을 제거하는 것으로 하나의 기본키가 둘 이상의 칼럼의 결정자인 경우에 이를 분해하는 것
  • 제 3 정규화 : 이행적 종속을 제거하는 것으로 A->B->C 를 A->B,B->C로 분해
  • BCNF 정규화 : 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

PK와 FK란?

PK

모든 행을 고유하게 식별하는 열로써 두 행이 동일한 값을 가질 수 없고 NOTNULL입니다. 자동으로 인덱스가 생성되며 생성되는 규칙은 사용자가 정의할 수 있습니다.

FK

다른 테이블의 기본 키인 테이블의 필드를 뜻합니다. 예를 들어 A테이블과 B테이블이 있을 때, A테이블의 PK를 B테이블의 외래키로 지정해서 테이블 간에 연관관계를 설정할 수 있습니다.

최종 프로젝트

겪은 문제점

  1. 로그인 및 회원가입 부분에서 nullable=false 로 세팅된 칼럼에 값을 안넣어 주어서 정상작동을 하지 않았다.
    -> builder 쪽에서 빠졌던 칼럼 추가 해주어 해결
  2. JwtAuthenticationFilter에서 필터링을 잘못하여 다른 에러가 발생하여도 동일한 에러코드가 나온다.
    -> 필터 이해도가 부족하여 아직 해결 못함
  3. controller에서 공통으로 반환하기로 정해둔 dto형식이 있는데 이 dto를 빌드 할 때 에러가 발생했다. 튜터님과도 해결 못 했었는데 같은 팀원분이 제안하신 방법으로 해보니 해결 되었다. 다음은 해당 dto와 에러가 발생한 부분의 코드, 해결 방법이다.
///RootResponseDto.java
@JsonInclude(Include.NON_NULL)
@Builder
@Getter
public class RootResponseDto<T> {
        String code;
        String message;
        T data;
}
//BoardController.java
@PostMapping
    public ResponseEntity<?> createBoard(
            @RequestBody BoardRequestDto boardRequestDto,
            @AuthenticationPrincipal UserDetailsImpl userDetails) {
        BoardResponseDto boardResponseDto = boardService.createBoard(boardRequestDto, userDetails.getUser());
        return ResponseEntity.ok(RootResponseDto.builder()
                .code("201")
                .message("보드 생성 성공")
                .data(boardResponseDto)		//<-여기서 에러 발생!!
                .build());
    }

2번 때문에 뭐가 문제인지 알 수가 없어서 해결하기 어려웠다. 이것이 기존 코드인데
boardService.createBoard(boardRequestDto, userDetails);
service에 넘길때 userDetails를 따로 처리하지 않고 그대로 넘긴것을 볼 수 있다. 이를 다음과 같이 userDetails에서 User값만 뽑아와서 넘겨주니 해결되었다.
boardService.createBoard(boardRequestDto, userDetails.getUser());

진행 상황

보드에 사용자가 가입 신청을 하고 보드 생성자는 신청자 목록을 열람하며 신청을 수락/거절을 할 수 있는 api를 구현중이다. 그런데 데이터를 보내도 에러가 발생하는 것도 아닌데 중간테이블에 칼럼이 생성되지 않아 해결법을 찾는 중이다.

이것만 해결 된다면 진행될 순서는 다음과 같다. 따로 기존 api를 참고 하지않고 이렇게 로직을 짜면 되지 않을까? 라고 생각이 드는대로 나타내 보겠다.

  1. 사용자가 게시판에 가입 신청을 요청하면 사용자와 게시판 사이의 중간테이블(이하 보드신청테이블) 에 신청자 id, 보드id, 신청자의 상태(대기,수락,거절) 을 가지는 칼럼 하나를 생성해준다.
  2. 보드 생성자는 본인이 생성한 보드에 신청을 보내어 현재 대기상태가 되어 있는 유저들의 목록을 Get 메서드를 통해서 전달 받는다.
  3. 대기상태의 유저 목록을 통해 유저 정보를 얻어와 해당 유저의 상태를 수락/거절 로 전환 시킨다.

현재 이 시나리오대로 코드작성은 완료한 상태이다. 내일 중간테이블 관련 문제를 해결하고 테스트를 해보아야겠다.

0개의 댓글