각종 후기/우아한테크코스

[우아한 테크코스 3기] LEVEL 2 회고 (113일차)

제이온 (Jayon) 2021. 5. 25.

안녕하세요? 제이온입니다.

 

오늘은 루터 회관에서 오전에는 수업을 듣고, 오후에는 프론트엔드 크루와 만나서 협업 미션을 진행했습니다.

 

 

협업 미션 2단계

우테코 시작이 2월 2일인데, 대략 4개월 만에 처음으로 개발적으로 프론트엔드와 협업을 해 보았습니다. 회의 시간은 약 1시간이었고, 백엔드가 해 줘야 하는 업무와 공통적으로 개발해야하는 업무에 대해 이야기했습니다. 먼저, 백엔드가 해 줘야 하는 주요 업무는 바로 '예외 처리'입니다. 이번 미션은 브라운이 작성하신 뼈대 코드를 이용하는데, 대부분 예외 처리가 되어 있지 않습니다. 따라서, 적절한 예외와 메시지를 던지도록 해야 합니다.

 

비슷한 맥락으로 상태 코드도 정의하였습니다. 저는 특정 값이 중복될 경우 단순히 400번 상태 코드를 반환하도록 설계했었는데, 파피의 의견에 따라 409번 이라는 상태 코드를 반환하기로 결정했습니다. 물론, 프론트 측에서는 4xx와 5xx를 나누는 것이 의미가 있으므로 400번대를 크게 고려할 필요는 없다고 말씀하셨으나, 그래도 이번 기회를 통해 더 다양한 상태 코드를 이용해 보자고 생각했습니다. 저의 생각으로는 아래와 같습니다.

 

 

401 - 인증 실패

404 - 존재하지 않는 path.

409 - 데이터의 정보가 중복됨.

400 - 그 외에 입력 오류

 

 

물론, 아직까지는 경험이 부족해서 4가지의 상태 코드밖에 다루지 못하지만, 그 전보다 한 가지의 기준이 더 생긴 것이므로 성장하고 있다고 생각합니다.

 

 

다음으로, 공통 업무는 지하철 전체 노선과 전체 역을 조회하는 API를 설계하는 것입니다. 사실, 백엔드 쪽에서는 "/lines"라는 API와 함께 전체 노선과 그 노선에 맞는 역을 조회하는 기능이 구현되어있습니다. 그래서 백엔드는 이에 대해 굳이 무언가를 할 필요성이 없습니다. 다만, 프론트에서는 백엔드와는 다르게 특정 역에서 환승할 수 있는 노선의 정보를 보여 주라는 요구 사항이 있었습니다. 그래서 백엔드는 프론트에게 특정 역에서 환승할 수 있는 노선 정보를 보내 주는 API를 설계하기로 결정했습니다.

 

처음에는 아래와 같이 "/lines/detail"이라는 path를 만들어서 전체 노선과 전체 역 (환승 정보 포함)을 응답하도록 설계했습니다.

 

 

[ {
  "id" : 1,
  "name" : "신분당선",
  "color" : "bg-red-600",
  "stations" : [ {
    "id" : 1,
    "name" : "강남역"
    "transfer": ["2호선", "신분당선"]
  }, {
    "id" : 2,
    "name" : "광교역"
    "transfer": ["신분당선"]
  } ],
  "sections" : [ {
    "upStation" : {
      "id" : 1,
      "name" : "강남역"
    },
    "downStation" : {
      "id" : 2,
      "name" : "광교역"
    },
    "distance" : 10
  } ]
} ]

 

 

하지만, 여기에는 순환 참조라는 문제점이 존재했습니다. Line은 Station을 정보를 알고 있는데, Station도 환승 정보를 얻기 위해서 Line을 알아야만 했죠. 그래서 "lines/detail"이 아닌, "station/transfer" path를 만들기로 결정했습니다.

 

 

[
    {
        "id": 1,
        "name": "강남역",
        "transfer": ["2호선", "신분당선"]
    }
]

 

 

물론, 프론트에서는 약간의 가공 작업이 필요하지만, 썬이 id를 key, transfer를 value 정보로 가공하여 효율적으로 잘 쓸 수 있다고 말씀해 주셨습니다. 그래서 최종적으로 API 설계는 위의 형태로 결정지었습니다.

 

처음으로 프론트엔드와 협업을 하면서 굉장히 재미있었습니다. 백엔드만 하다 보니 시선이 서버로만 향했는데, 프론트엔드 크루분들의 다양한 의견을 들으면서 새로운 인사이트를 얻을 수 있었습니다. 특히, 지하철역 이름을 지을 때 '-역'으로 끝나게 네이밍을 유저에게 강제할 수 있는데, 썬은 유저의 어느정도 자유로운 입력이 중요하다고 했습니다. 실제로 지하철역 간판을 봐도 단순히 역을 제외한 이름 정보만 나타내는 경우가 많습니다.

 

 

 

 

다음 레벨 때는 프론트엔드 크루들과 오랜 기간 프로젝트를 진행하는데, 더욱 더 사용자친화적인 시야를 제가 가질 수 있도록 많은 의견을 나눌 수 있으면 좋겠습니다.

 

 

공통 DB 사용하기

현재 백엔드팀은 저, 조엘, 조앤, 파피로 이루어져 있습니다. 그리고 DB는 각자의 인스턴스에서 설치하여 사용하고 있습니다. 넷 다 다른 데이터를 가지고 있으므로 프론트 입장에서 테스트할 때 용이하지가 않습니다. 그래서 하나의 공용 DB 인스턴스를 만들어서 그 DB를 공통으로 사용하기로 하였습니다.

 

강의 자료에 나와 있는 대로 MySQL을 설치하고, 스키마를 생성하는 것까지는 똑같으나 외부 접속용 계정을 만들고 그것에게 권한을 주어야 했습니다.

 

 

$ sudo apt update
$ sudo apt install mysql-server

-- MySQL 최고 권한으로 접속 (기본설정 비밀번호 없음)
$ sudo mysql -u root -p

-- 외부 접속용 계정 생성
# create user [사용 계정명]@'[WAS 서버 public IP]' identified by '[비밀번호]';  

-- schema(database) 생성
# create database [DB 이름];

-- 외부 접속용 계정에 권한 부여
# grant all privileges on [DB 이름].* to [사용 계정명]@'[WAS 서버 public IP]';

 

 

공용 DB 입장에서는 아무 WAS 서버에게 접근 권한을 주면 위험하므로 위와 같이 외부 접속용 계정을 따로 생성하고 권한을 부여해야 합니다. 즉, 백엔드 팀원이 4명이므로 4명의 WAS IP 계정이 필요한 셈이죠. 다만, 위에서 WAS 서버 public IP를 사용하라고 작성하였는데, 만약 WAS가 DB와 같은 서브넷 안에 있다면 private IP를 사용해도 무방합니다.

 

그리고 MySQL 설정 파일을 열어서 포트 번호와 bind-address를 0.0.0.0으로 바꿔야 합니다.

 

 

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# mysqld.cnf

-- 보안그룹에 허용되어있는 포트. 우테코 SG-DEFAULT 보안그룹 기준 8080과 80을 사용할 수 있음.
-- 기본 등록되어 있는 3306 포트는 SG-DEFAULT 보안그룹에 제공되어 있지 않아 사용불가.
port		= 8080
또는
port    = [보안그룹에 맞는 포트번호]

-- address를 0.0.0.0으로 열어둘 경우 접속을 위에서 설정한 접속용 계정을 통해서만 제어 가능
-- mysql 자체 설정의 접속 제어를 원한다면 WAS 서버 public IP 등록
bind-address		= 0.0.0.0
또는
port            = [WAS 서버 public IP]

 

 

제가 사용하고 있는 인스턴스의 보안 그룹에는 3306 포트가 없어서 8080 포트로 바꿔 주었습니다. 그리고 bind-address는 127.0.0.1에서 0.0.0.0으로 변경했습니다. 이것은 아까 설정한 접속용 계정을 통해서 제어가 가능하다는 것을 의미합니다. 그리고 WAS의 yml에서  [MySQL EC2 인스턴스 public IP]:8080을 datasource-url에 적어주면 됩니다. 이 부분도 마찬가지로 WAS가 DB와 같은 서브넷 안에 있다면 private IP를 적으셔도 괜찮습니다.

 

여기에 더 나아가서 로컬과 DB 인스턴스를 연결하고 싶다면, WAS의 yml에서 반드시 [MySQL EC2 인스턴스 pulic IP]:8080을 datasource-url에 적어야 하고, DB 인스턴스에서도 로컬의 public IP에 대해 권한을 주어야 합니다. 왜냐하면 둘은 같은 서브넷 안에 없기 때문이죠.

 

 

배포 쉘 스크립트 만들기

그전까지는 배포나 빌드 및 실행을 위해서 한땀한땀 코드를 찾아가면서 작성했습니다. 당연히.. 기억력이 안 좋아서 그런지 매번 강의 자료에 의존해야 했죠. 오늘은 조엘에게 쉘 스크립트를 만드는 방법을 배웠습니다.

 

 

#!/bin/bash

rm -rf atdd-subway-fare/
git clone -b step1 --single-branch https://github.com/pjy1368/atdd-subway-fare.git
cd atdd-subway-fare/
./gradlew clean build
cd build/libs/
kill $(lsof -t -i:8080)
nohup java -jar -Dspring.profiles.active=remote atdd-subway-fare-0.0.1-SNAPSHOT.jar 1> log.txt 2>&1 &

 

 

위와 같이 이미 있던 프로젝트 삭제, clone, 빌드, 실행중이던 프로세스 제거, 실행을 한큐에 작업해 줍니다. 이로 인해 저의 스트레스가 한결 줄었죠 ㅎㅎ 조엘 땡큐!

 

 

정리

오늘은 API 설계 및 공용 DB 생성, 쉘 스크립트 작성을 하였습니다. 짧은 시간이지만 굉장히 의미있는 일들을 했다고 생각합니다. 내일은 각종 예외 처리를 싹다 할 예정입니다. 안그래도 프론트 크루들이 고생해 주고 있는데, 저라도 원활한 기능을 제공하도록 노력해야겠습니다.

 

 

참고 자료

 

Hyeon9mak/WIL

학습한 내용을 정리하자! Contribute to Hyeon9mak/WIL development by creating an account on GitHub.

github.com

 

댓글

추천 글