01-05 TIL

거북·2024년 1월 5일

TIL

목록 보기
18/22

요약

오늘부터 기술면접을 대비하여 자주 출제되는 문항30개 중 두문항씩 답안을 작성해 보았고 최종 프로젝트를 본격적으로 시작하여 맡은 파트 개발을 진행하였다.

기술면접 대비

RDBMS,NOSQL의 특징 및 장단점

RDBMS

  • 데이터가 정해진 스키마에 따라 테이블에 저장되며 데이터 관계를 통해 여러 테이블에 분산됨
  • 테이블의 구조와 데이터 타입 등을 사전에 정의해야하며 이미 정의된 형태의 데이터만 삽입할 수 있음

장점

  • 스키마가 명확하다
  • 데이터 무결성을 보장한다
  • 데이터를 중복없이 저장한다
    단점
  • 유연성이 떨어지고 추후 수정이 어렵다
  • 관계를 맺고 있어 쿼리문이 복잡해질 수 있다
  • 대체로 수직적 확장만 가능하다

NOSQL

  • 테이블 형식이 아니며, 다양한 유형의 데이터를 가진다

장점

  • 저장된 데이터를 조정하고 새로운 필드 추가를 유연하게 할 수 있음
  • 어플리케이션이 필요로 하는 형식으로 저장해서 데이터를 읽어오는 속도가 빠름
  • 수직 및 수평 확장이 가능해서 모든 읽기와 쓰기 요청 처리가 가능

단점

  • 유연성으로 인해 오히려 데이터 구조 결정을 미루게 될 수 있다
  • 데이터 중복을 계속 업데이트 해야한다.
  • 여러 컬렉션에 중복되어 있기 때문에 수정이 필요한 경우 모든 컬렉션에서 수정해야한다

취합

RDBMS는 테이블의 구조를 사전에 정의하여 데이터를 관리하고 NOSQL은 다양한 유형의 데이터를 유형에 따라 관리한다. 이엔 각각 장단점이 있는데 RDBMS는 사전에 구조를 정하기 때문에 스키마가 명확하며 데이터 무결성을 보장한다는 장점이 있지만 유연성이 떨어지고 많은 관계를 맺을 수록 쿼리문이 복잡해 진다는 단점이 있다.

NOSQL의 장점으로는 어플리케이션이 필요로 하는 형식으로 데이터를 저장해서 읽어오는 속도가 빠르며 수직 및 수평 확장이 가능해서 유연하게 데이터를 관리할 수 있다. 하지만 데이터 중복이 발생할 수 있으며 이를 수정할 때 모든 컬렉션에서 일일이 삭제해주어야 하는 번거로움이 있다.

MVC패턴이란

사용자 인터페이스, 데이터 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴으로 비즈니스 로직과 화면을 구분하는데 중점을 두고 있다. 먼저 사용자의 요청을 controller를 통해 받고 controller는 service에서 처리한 로직을 model에 저장한다. 이렇게 저장된 결과를 view를 통해 다시 사용자에게 전달하는 패턴이다. 이의 주된 목적은 관심사 분리라고 생각하며 이를 통해 결합도를 낮추어 재사용성 및 확장성을 높일 수 있다. 이는 서비스의 유지보수에도 용이하며 단위 테스트 코드를 개발하는데 수월하다.

최종 프로젝트

프로젝트 요약

  • 야구, 축구와 같은 인원이 많이 필요한 스포츠를 같이 즐길 사람을 모집하기 위한 커뮤니티를 만드는 프로젝트를 구상했다.
  • 사용자는 모집을 위한 게시글을 작성하고 이 모집에 흥미가 있는 다른 사용자는 해당 게시글에 참가 신청을 할 수 있다.
  • 보낸 신청은 게시글 작성자가 수락 및 거절을 할 수 있다.

내가 맡은 부분은 사용자가 모집을 위한 게시글과 관련된 api를 만드는 것이다.

오늘 한 것

기존에 팀장의 깃허브에 레포지토리를 파서 작업을 하던 방식에서 벗어나 organization을 새로 만들어서 작업을 해보려고 했으나 인증 문제로 push가 되지 않아 기존 방식대로 레포지토리를 파고 작업을 시작했다.
게시물 기능을 맡아서 기본적인 CRUD는 다 구현하였고 게시물에 참가 신청을 보내는 부분도 구현하였다. 다음은 사용자가 보드에 가입 신청을 요청하는 부분의 코드이다.

//BoardService.java
public void attendBoard(Long boardId, UserDetailsImpl userDetails) {
        Board board = findBoard(boardId);
        User user = userDetails.getUser();
        user.attendBoard(board);
    }
//User.java
public void attendBoard(Board board) {
        AttendBoard attendBoard = new AttendBoard(board,this, Participation.wait);
        this.attendBoards.add(attendBoard);
    }

AttendBoard 라는 엔티티를 만들어 중간 테이블로 사용하여 UserBoard를 매핑해주었다.

해야할것

  • 테이블에 보드와 그 보드에 참가 신청을 한 유저의 id는 저장되었으나 이를 보드 관리자에게 전달하여 수락 및 거절을 할 수 있는 api를 만들어야 한다.
  • 요청을 보낸 유저들의 목록을 게시물 작성자가 확인하는 것까지 구현을 하였고 이를 수락 및 거절하는 방법을 생각해 보아야 한다.

문제점 및 보완사항

  • 설계단계에서 보드의 총 인원수 칼럼만 생성하였었는데 실시간으로 몇명이 모집되었는지를 나타내는 현인원수 칼럼을 추가해야 한다.
  • 보드에 참가 신청을 할 때 단순히 boolean으로 수락/거절을 받으면 된다고 생각하고 설계했으나 수락/거절 외에도 대기 상태가 필요할것 같아서 해당 3항목을 가지는 enum을 생성하였다.

0개의 댓글