포시코딩

12월 5주차 - 스파르타 내일배움캠프 7주차 본문

WIL

12월 5주차 - 스파르타 내일배움캠프 7주차

포시 2023. 1. 2. 15:21
728x90

이번 주 알게 된 점

Python 다루기

코딩테스트 연습문제를 풀면서 아무리 문제가 쉬워도 여러 사람들이 푼 방식을 보면 

거기서 항상 배울게 생긴다.

아래는 이번주에 문제를 풀며 새로 배우거나 복습할 필요가 있는 내용들이다.

 

str[::] 문자열 다루기 심화

https://4sii.tistory.com/290

 

[프로그래머스][Lv.0] 암호 해독

문제 https://school.programmers.co.kr/learn/courses/30/lessons/120892 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이

4sii.tistory.com

이 문제에 대한 풀이 방법으로 활용하는 방법 참고.

[a:b:c] -> a부터 b까지 c만큼 증가하며 인덱스를 찾는 방법

 

divmod()

result = divmod(14, 3)
print(result)  # (4, 2)

divmod(a, b)에 대해 몫과 나머지를 리턴받는 함수

 

set

def solution(s1, s2):
    return len(set(s1) & set(s2))

두 list s1, s2에 대해 교집합을 구하거나 합집합을 구하는 방식으로 활용 가능하다.

 

아스키코드 변환

# 아스키코드로 변환
ord('a')
ord('A')

# 문자로 변환
chr(97)

아스키코드 변환은 ord()와 chr()만 기억하면 직접 입력해보며 확인하면 되니

함수를 잘 기억하자

 

대소문자 다루기

str.islower() # 소문자인지 확인
str.isupper() # 대문자인지 확인
str.lower() # 소문자로 변환
str.upper() # 대문자로 변환

str.swapcase() # 대소문자를 서로 변환

영어 대소문자에 대해 아스키코드로 다루는 방법도 있지만 간단하게 지원되는 내장 함수로 다루는 방법도 있다.

 

prettier를 통한 팀프로젝트 코드 균일화

혼자 코딩했다면 생각도 안하고 사용하지 않았을 기능인데

팀프로젝트를 하면서 4명이 각기 다른 방식으로 코딩을 짜고

코딩에 익숙하지 않은 분들의 코드가 보기 어려운 상황이 많이 발생하는걸 목격하면서 필요성을 느끼게 되었다.

 

vscode의 extension으로 있는 prettier는 언어마다 다르게 존재하고

적용하려면 각 파일에서 명령 커맨드를 입력해야 하는데

이번 프로젝트에 적용하게된 prettier는 설정 파일을 통해 프로젝트의 모든 파일에 적용이 가능해 도입하게 됐다.

 

.prettierrc.js

module.exports = {
  trailingComma: 'es5',
  tabWidth: 2,
  semi: true,
  singleQuote: true,
  arrowParens: 'always',
  printWidth: 130,
};

package.json과 같은 위치에 위 파일을 위치시킨다.

각 옵션에 대한 설명은 다음과 같다.

  • trailingComma: 여러 줄을 사용할 때, 후행 콤마 사용 방식
  • tabWidth: 탭 너비
  • semi: 세미콜론 사용 여부
  • singleQuote: single 쿼테이션 사용 여부 ("" 말고 ''로 사용)
  • arrowParens: 화살표 함수 괄호 사용 방식
  • printWidth: 줄 바꿈할 폭 길이

그 외 더 다양한 옵션들이 있으니 궁금하면 찾아보자

https://prettier.io/docs/en/options.html

 

Prettier · Opinionated Code Formatter

Opinionated Code Formatter

prettier.io

package.json

  "scripts": {
    "format": "prettier --write '**/*.js'",
  },

위 세팅을 후 아래 명령어를 통해 모든 파일에 prettier를 적용해 균일화가 가능하다.

npm run format

 

 

이번 주 목표 달성

코딩테스트 연습문제 Lv.0 다 풀기

이번주내로 다 풀어보자 했던 Lv.0 문제들을 결국 해내지 못했다.

이번주 초반 내내 따로 시간을 뺏게된 일도 있었고

프로젝트의 시작과 함께 점점 한 문제 마다 정리하는 시간이 쌓여 

다 풀지 못했는데

남은 문제들은 다음주 프로젝트 기간에 짬내서 조금씩 풀어 다다음주에는 Lv.1 문제로 넘어갈 예정이다.

 

계층형 아키텍처 패턴 적용

시작하는 팀프로젝트에 내가 지금껏 배운 폴더 구조 형식과

이번에 배운 3계층형 아키텍처 패턴을 같이 적용해서

팀원들이 작업하기 좋게 기본 폴더 구조를 만들어 프로젝트를 공유했다.

 

지금까지 내가 해오던 구조로는 나중에 테스트 코드를 작성할 때 문제가 될 수 있는 부분들이 많았는데

스파르타 Node.js 심화 강의를 통해 controller, service, repository가 어떤 구조여야 

유닛 테스트를 하기 좋을지 알게되어 적용해봤는데

앞으로 있을 테스트 코드 작성에서 유의미한 성과가 있었으면 좋겠다.

 

REDIS 적용 실패

일반 DB처럼 local에 redis를 설치해 적용하려 해봤는데

대부분이 다 docker에 설치해서 사용하는데다

무료 클라우드 redis는 node.js상에서 다루는거에 대한 정보를 찾기도 힘들고

그나마 찾은 정보들로 해봐도 안되서 일단 나중에 적용하기로 미루게 되었다.

아무래도 프로젝트 기간도 다가오고 계속 밀리고 있는 강의 진도가 부담이 되서 어쩔 수 없었다.

 

대신, 알아보며 사용법을 공부했는데

생각보다 너무 간단했다.

일반 sequelize model을 다루는 것 처럼 접속 정보로 연결한 redis 객체에 대해 

정해진 명령어를 통해 저장하거나 데이터를 가져오면 되는거였다.

https://www.npmjs.com/package/redis

 

redis

A modern, high performance Redis client. Latest version: 4.5.1, last published: a month ago. Start using redis in your project by running `npm i redis`. There are 8824 other projects in the npm registry using redis.

www.npmjs.com

 

 

다음 주 목표

팀프로젝트 완성

이번 팀프로젝트에서 제시한 필수 구현 기능으로는

  • 계층형 아키텍처 패턴으로 프로젝트 구성
  • 서비스 구조를 통한 합리적 설계
  • 테스트 코드
  • socket.io 사용

이렇게 네가지다. 

적어보이지만 프로젝트를 관통하며 적용되는 기술들이기 때문에

기능 하나를 완성했다고 끝나지 않는 부분들이라

처음부터 끝까지 잘 지키며 개발하고 있는지 확인하는게 필요하다.

 

테스트 코드를 살면서 처음 해봐서 그런지

아직 기껏해야 따라하는 정도인데 이번 프로젝트를 만들며 구현한 기능에 대해 

테스트 코드를 잘 만들 수 있을지이다.

그래도 테스트 코드 만들 생각을 하며 기능 구현을 하니 예전에 보이지 않던 것들이 보인다.

 

user.ctrl.js

const process = {
  register: async (req, res) => {
    const user = new User(req.body);
    const response = await user.register();

    return res.status(response.code).json({ message: response.message });
  },
  // ...생략
}
module.exports = {
  process,
};

User.js

class Like {
  constructor(body) {
    this.body = body;
  }
  // ...생략

이런식으로 혼자 진행했던 프로젝트에서는 '구조만' 나눴다는 느낌이었는데

지금은 모든 controller, service, repository 파일에 대해 

클래스를 만들고 생성자를 통해 사용하면서

나중에 테스트 코드상에서 각각 분리해 사용할 수 있게끔 만드는게 중요해졌다.

 

User.service.js

class UsersService {
  usersRepository = new UsersRepository(User);
  tokensRepository = new TokensRepository(Token);

  createUser = async (email, password, name, phone, address, admin, point) => {
  // ...생략

이와 같은 형태.

 

맡은 기능을 서둘러 완성시킨 후 테스트 코드를 작성하고, 다른 분들의 테스트 코드를 도와주다보면

테스트 코드 작성법에 대해 조금 눈이 트이지 않을까 기대하고 있다.

728x90