[TIL] 5월 6일

yeon·2021년 5월 6일
0
스크린샷 2021-05-07 오전 1 30 46

team과 game을 N:1 관계로 하고 싶었는데, 스키마를 짜다가 실패했다. mapping table을 하나 더 만들어보기도 하고 이리저리 시도해보다가 잘 안되어서 그냥 game 테이블을 따로 두고, team과 관계설정을 안 맺도록 했다. game의 컬럼들이 team의 id를 갖고 있는데 관계설정이 안되어있어서 굉장히 이상해보이는데 이 이상의 방법이 떠오르지 않는다.

record 조회하기, record가 member를 참조? member가 record를 참조?

{
    "teamId": 1,
    "records": [
        {
            "name": "나지완",
            "position": "타자",
            "atBat": 3,
            "hit": 1,
            "out": 1,
            "average": 3.0
        },
        {
            "name": "김유신",
            "position": "타자",
            "atBat": 3,
            "hit": 1,
            "out": 1,
            "average": 3.0
        }
    ]
}

위와 같이 record를 조회할 때 API상으로는 member의 name을 포함하는게 자연스러워보인다. 근데 Record 도메인 클래스에다가 member의 name을 필드로 갖게 되면 디비 설계상으로 member가 record를 참조하도록 해야하는데 이게 뭔가 어색했다. member가 record를 참조한다면 스키마는 이렇게 될 것이다.

create table member
(
    id       int primary key auto_increment,
    name     varchar(45),
    position varchar(45),
    team     int references team (id),
    record   int references record (id)
);

create table record
(
    id       int primary key auto_increment,
    at_bat   int,
    hit      int,
    `out`    int,
    average  double
);

record가 id값을 가지는 것이 어색해보이고, record가 member를 참조하는 방향이 더 올바르다고 생각된다. 계속 이부분이 헷갈리는데 record가 id를 갖는게 맘에 들지 않았다.

그래서 아래와 같이 바꿨다.

create table member
(
    id       int primary key auto_increment,
    name     varchar(45),
    position varchar(45),
    team     int references team (id)
);

create table record
(
    at_bat    int,
    hit      int,
    `out`    int,
    average  double,
    member int references member (id)
);

record가 member를 참조하도록 변경했다.

그래서 위의 JSON형식과 같이 name을 포함하게 하려면 join을 사용해야할 것 같았다.

public interface TeamRepository extends CrudRepository<Team, Long> {

    @Query("select at_bat, hit, `out`, average, name, position from record left join member 
		on record.member = id where id = :id")
    Optional<RecordMember> findRecordByMemberId(Long id);

}

위와 같은 메소드를 선언해주고 join 쿼리문을 작성하고, RecordMember라는 클래스를 만들었다.

이렇게 해주니 내가 원하는대로 잘 나왔다.

오늘한일

  • Game 테이블을 추가해서 DB 설계를 다시 하고, 이걸 바탕으로 API 설계를 했다. team과 team별 member 조회하기, team의 member별 record 조회하기, game의 team별로 score 조회하기, game 조회하기 까지는 설계를 완료했다. Post 방식도 JSON 타입으로 프론트에서 어떻게 넘겨줘야할지를 설계해야하는건가 잘 모르겠다. 내일 다른 백엔드분들한테 물어봐야지
  • 호눅스 배포수업... 뭔지 이해는 대략 되는거 같지만 혼자 하면 못할 듯하다.
  • 호눅스 인프런 AWS 강의 수강, VPC 실습
    • VPC 생성, public과 private 두개의 서브넷 생성하고 CIDR 범위 설정하기, 인터넷 게이트웨이 추가해서 VPC에 연결, NAT 게이트웨이란
    • 화요일 수업시간에 다뤘던 내용이라 복습하는 느낌이여서 좋았다. 실습을 따라하면서 수강했다.
    • 내일은 public과 private 각각 서브넷에 ec2를 만들고 public에서 private에 접속하는걸 해봐야겠다.
  • baseball game 미션 구현중인데 aggregate root에 해당 되는 엔티티에 대해서만 repository를 만든 상태에서, 이 repository에서 직접 쿼리문으로 하위 aggregate를 가져와서 업데이트 하고 save하면 잘 동작하지 않는다. 도메인 클래스에서 하위 aggregate를 찾아서 정보를 업데이트하고 save하니 잘 동작한다.

Todo

내일

  • GameController 부분 service로 분리하기
  • 사용자 정의 예외 생성
  • AWS 배포 ec2 두개로 나눠서 해보고, 내용 정리하기

0개의 댓글