728x90

1.자료구조란?

  • 용어: 자료구조, 데이터구조, datastructure
  • 대량의 데이터를 효율적으로 관리할 수 있는 데이터의 구조를 의미
  • 코드상에서 효율적으로 데이터를 처리하기 위해, 데이터 특성에 따라, 체계적으로 데이터를 구조화해야함
    • 어떤 데이터 구조를 사용하느냐에 따라 코드 효율이 달라짐
  • 효율적으로 데이터를 관리하는 예
    • 우편번호: 5자리 우편번호로 국가의 기초구역을 제공
    • 학생관리: 학년, 반, 번호를 학생에게 부여해서, 학생부를 관리
  • 대표적인 자료구조
    • 배열, 스택, 큐, 링크드 리스트, 해쉬 테이블, 힙등

2.알고리즘이란?

  • 용어: 알고리즘, algorithm
  • 어떤 문제를 풀기위한 절차/방법
  • 어떤 문제에 대해 특정한 '입력'을 넣으면, 원하는 '출력'을 얻을 수 있도록 만드는 프로그래밍
  • 좋은 알고리즘의 요소: 시간복잡도, 데이터 효율성등

3.자료구조와 알고리즘이 중요한 이유

어떤 자료구조와 알고리즘을 쓰느냐에 따라 성능이 전지차다 --> 결국 프로그래밍을 잘 할수 있는 기술과 역량을 익히고, 검증할 수 있음

728x90

'기술 > 알고리즘' 카테고리의 다른 글

자료구조(2)-링크드리스트(LinkedList)  (0) 2022.01.21
자료구조(1)-큐와 스택  (0) 2022.01.19
코딩테스트 준비  (0) 2022.01.19
그리디(2):큰 수의 법칙  (0) 2021.05.22
그리디(1): 거스름돈  (0) 2021.05.21
728x90

코딩테스트 문제를 마구잡이식으로 풀다 보니 아무래도 자료구조/ 알고리즘 관련 면접에서 막힌 경험이 생겼다.. 그리하여 남는 시간동안 자료구조/알고리즘 이론을 좀더 튼튼히 준비한후 동시에 코딩테스트 문제를 풀어보려한다.

 

4군데의 기업에서코딩테스트를 봤는데 2군데 합격, 2군데 불합격이떳다ㅎ... 대부분 유형은 프로그래머스, 백준과 같은 알려진 사이트에서의 문제, sql문제, restapi문제였고 경험은 없지만 지원하는 회사가 사용하는 프레임워크로 시험을 치는 회사가 있다고 했다. 약 2개월동안 좀 빡쌔게 기본을 다시 복습한뒤 이후부턴 여러 회사에 지원해보며 코딩테스트에 모두합격할수 있도록 대비해야겠다.

 

공부 환경은 유명한 아나콘다 환경에서 준비할예정!

728x90
728x90

1.이미지란?

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Image라고 한다. 도커의 실행은 프로세스 실행을 하는것이므로 이 프로세스를 실행하기 위한 모든 파일과 설정값을 지닌것으로, 도커의 주체 즉, 실행할 파일이라고 생각하면 된다. 이미지 파일로 설정할수 있는것들은 mysql, ubuntu, nginx등 이미 만들어져 있는 공식적인 이미지 같은경우, 도커허브(https://hub.docker.com/)에서 모두 확인가능하며 깃허브에 코드를 올리는것과 마찬가지로 개개인이 만든이미지를 업로드하고 공유할수 있다. 그리고 외적으로는 개개인이 새롭게 자신만의 프로젝트를 올릴때는 깃허브와 같은 소스공유 방법을 통해 이미지를 빌드 할수 있다.

 

2.이미지 만들기

docker build -t corin2/testimage:ver1 .

-docker build -t : 도커 이미지 생성 명령어

-corin2 : 이미지를 생성한 사람의 이름

-testimage : 이미지 이름

-:ver1 : 태그 즉, 버전으로 활용가능

-. : 빌드 컨텍스트 위치로 통상적으로 현재위치인 .을 사용하나 필요에따라 다른 디렉터리를 지정하여도 문제없다.

추가로, .dockerignore파일또한 생성가능한데 .gitignore와 같은 역할로 민감한 정보를 가리는것 외에도 빌드시에 가상환경과 같은 부분을 같이 빌드하지 않기위해서도 사용된다.

 

즉, 위 명령어를 통해 생성된 이미지로 도커를 실행시킬수 있는것이다. 이미지는 통상적으로 Dockerfile스크립트 파일을 생성해 실행하는데 Dockerfile에 들어가는 명령어는 아래와 같다.

3.Dockerfile 명령어

FROM 기본이미지
RUN 쉘 명령어 실행
CMD 컨테이너 기본 실행 명령어
EXPOSE 오픈되는 포트 정보
ENV 환경변수 설정
ADD 파일 또는 디렉터리 추가
COPY 파일 또는 디렉터리 추가
ENTRYPOINT 컨테이너 기본 실행 명령어
VOLUME 외부 마운트 포인트 생성
WORKDIR 작업 디렉토리 설정
ARGS 빌드타임 환경변수 설정
LABEL  key - value데이터
ONBUILD 다른 빌드의 베이스로 사용될때 사용하는 명령어
USER RUN, CMD, ENTRYPOINT를 실행하는 사용자

4.활용

도커 이미지 생성같은경우는 작업 환경에서 직접 빌드하는 방식도 있지만 주로 깃허브에서 소스를 가져와 빌드하는 방법이다. 이방법같은경우, 다음 목차에서 간단한 프로젝트를 가져와 빌드하도록 해보겠다.

 

ref. 인프런 강의. 초보를 위한 도커 안내서를 보고 참고하여 정리하였습니다.

 

Docker - 도커란 무엇인가

도커, 도커를 사용하는 이유, 도커의 특징 이해

wooody92.github.io

 

 

초보를 위한 도커 안내서 - 인프런 | 강의

도커를 1도 모르는 입문자, 초보자분들을 위한 도커 안내서 입니다. 복잡한 내용을 제외하고 도커가 왜 인기가 많고 어떻게 사용하는지 빠르게 익힐 수 있도록 집중하였습니다., 데브옵스 입문

www.inflearn.com

 

728x90

'기술 > Devops' 카테고리의 다른 글

aws(2)VPC(Virtual Private Cloud)  (0) 2022.04.19
aws(1)S3(Simple Storage Services)  (0) 2022.04.19
도커(3)-도커 컴포즈  (0) 2022.01.17
도커(2)-도커 설치와 실행  (0) 2022.01.17
도커(1)-도커란?  (1) 2022.01.13
728x90

1.도커 컴포즈란?

일반적인 시스템은 단일 애플리케이션으로 구동이 되지 않습니다. 여러 개의 애플리케이션이 서로 의존성 있게 구성되어 시스템이 이뤄져 있습니다. 그렇다면 흔히 하나의 컨테이너가 하나의 애플리케이션을 담당한다고 하면 여러 개의 컨테이너가 필요로 합니다. 이때 필요한 기술이 도커 컴포즈(Docker Compose)입니다. 도커 컴포즈는 yaml 포맷으로 작성되며 여러 개의 컨테이너의 실행을 한 번에 관리를 할 수 있게 해 줍니다.

2.도커 컴포즈 설치

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/
docker-compose-$(uname -s)

3.도커 컴포즈 실행과 종료

-up명령어: 컨테이너 실행

docker-compose up -d

-down명령어: 종료

docker-compose down

4.도커 컴포즈 문법

version: '2' 
services: 
 db: 
   image: mysql:5.7 
   volumes: 
     -./mysql:/var/lib/mysql 
   restart: always 
   environment: 
     MYSQL_ROOT_PASSWORD: wordpress 
     MYSQL_DATABASE: wordpress 
     MYSQL_USER: wordpress 
     MYSQL_PASSWORD: wordpress
 wordpress: 
   image: wordpress:latest 
   volumes: 
     -./wp:/var/www/html 
   ports: 
     -"8000:80" 
   restart: always 
   environment: 
     WORDPRESS_DB_HOST: db:3306 
     WORDPRESS_DB_PASSWORD: wordpress

-version: docker-compose.yml 파일의 명세 버전

version: '2'

-services: 실행할 컨테이너 정의, docker run --name wordpress과 같다고 생각할 수 있음

services:
 db:
 ...
 wordpress:
 ...

-image: 실행할 이미지 태그부분에 버전기입을안할시 자동으로 lastest버전으로 실행

services:
 wordpress:
 image: wordpress:sample

-ports: 컨테이너와 연결할 포트 {호스트 포트}:{컨테이너 포트}

services:
 db:
   ...
   ports:
     - "8000:8000"

-environment: 컨테이너에서 사용할 환경변수 - {환경변수 이름}:{값}

services:
 mysql:
 ...
   environment:
   - MYSQL_ROOT_PASSWORD=somewordpress: '3'

-volumes: 마운트하려는 디렉터리 - {호스트 디렉터리}:{컨테이너 디렉터리}

services:
 django:
 ...
   volumes:
     - ./app:/app

-build: 이미지를 자체 빌드 시 사용 - image속성 대신 사용

django:
 build:
   context: .
   dockerfile: ./compose/django/Dockerfile-dev

그외 logs, stop, start와 같은 기본 명령어는 도커 명령어와 동일!!

 

ref. 인프런 강의. 초보를 위한 도커 안내서를 보고 참고하여 정리하였습니다.

 

Docker - 도커란 무엇인가

도커, 도커를 사용하는 이유, 도커의 특징 이해

wooody92.github.io

 

 

초보를 위한 도커 안내서 - 인프런 | 강의

도커를 1도 모르는 입문자, 초보자분들을 위한 도커 안내서 입니다. 복잡한 내용을 제외하고 도커가 왜 인기가 많고 어떻게 사용하는지 빠르게 익힐 수 있도록 집중하였습니다., 데브옵스 입문

www.inflearn.com

 

728x90

'기술 > Devops' 카테고리의 다른 글

aws(2)VPC(Virtual Private Cloud)  (0) 2022.04.19
aws(1)S3(Simple Storage Services)  (0) 2022.04.19
도커(4)-이미지  (0) 2022.01.19
도커(2)-도커 설치와 실행  (0) 2022.01.17
도커(1)-도커란?  (1) 2022.01.13
728x90

1.도커 설치

도커는 기본적으로 리눅스 기반에 맞춰 개발환경이 갖춰져있으므로 만약 윈도우 사용자라면 VM으로 우분투를 설치하여 사용하길 권장합니다.

curl -s https://get.docker.com/ | sudo sh

설치 방법은 여러개가 있겠지만 아래의 명령어로 손쉽게 설치 가능합니다.

 

docker version

위의 명령어로 도커가 설치완료되었는지 확인합니다.

 

2.도커 실행

docker run [OPTIONS] IMAGE:[version] [COMMAND]

 

-option

-d detached mode (백그라운드 모드)
-p 호스트와 컨테이너의 포트를 연결
-v 호스트와 컨테이너의 디렉토리를 연결
-e 컨테이너 내에서 사용할 환경변수 설정
--name 컨테이너 이름 설정
--rm 프로세스 종료시 컨테이너 자동 제거
-it 터미널 입력을 위한 옵션(컨테이너 내부)
--network 네트워크 연결

위와 같은 형식으로 도커를 실행할수 있다.

 

-실행

docker run ubuntu:20.04

위와 같이 실행하면, 우분투 20.04 이미지를 다운받아 실행하게 됩니다. 도커의 실행은 하나의 프로세스 실행과 같아서 위의 명령어로는 실행은 되지만 이외의 동작은 없고 바로 프로세스가 종료되게 됩니다.

 

docker run -it ubuntu:20.04

실행한 우분투 컨테이너 내부에서 터미널 입력이 가능해집니다.

 

docker run -d -p 3306:3306 \ 
 -e MYSQL_ALLOW_EMPTY_PASSWORD=true \ 
 --name mysql \ 
 mysql

mysql최신 버전의 이미지를 mysql이름을 지정후 다운 받은후, 3306(로컬):3306(컨테이너) 포트를 연결시켜주어 백그라운드에서 동작시켰습니다.

 

docker exec -it mysql mysql 
create database wp CHARACTER SET utf8; 
grant all privileges on wp.* to wp@'%' identified by 'wp'; 
flush privileges;

-exec명령어

docker run과는 달리, docker exec는 이미 실행중인 컨테이너에 접속할때 사용되는 명령어입니다. exec로 백그라운드에서 실행중인 mysql에 접속하여 데이터베이스를 생성해주었습니다.

 

3.도커 기본명령어

-ps: 실행중인 도커 컨테이너를 확인하는 명령어

docker ps
docker ps -a # 실행중지된 컨테이너까지 모두 확인가능

-stop: 도커 컨테이너 중지 명령어

docker stop [OPTIONS] CONTAINER [CONTAINER...]

컨테이너 ID or NAME으로 중지명령

 

-rm: 도커 컨테이너 삭제 명령어

docker rm [OPTIONS] CONTAINER [CONTAINER...]

-logs: 실행중인 컨테이너의 로그를 확인하는 명령어

docker logs [OPTIONS] CONTAINER

-images: 다운받은 이미지를 확인하는 명령어

docker images [OPTIONS] [REPOSITORY[:TAG]]

-pull: 도커 이미지를 다운받는 명령어

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

-rmi: 도커 이미지 삭제 명령어

docker rmi [OPTIONS] IMAGE [IMAGE...]

4.도커 network

앞서 설명한 명령어중 --name을 통해 네이밍이 되어있는 컨테이너들끼리 통신을 위한 방식입니다.

웹서비스를 운영할때 80번 외부포트에서 request를 받아주면 내부의 로컬끼리는 포트번호를 통해 통신을 하는데 도커의 컨테이너 통신에서는 컨테이너를 생성할때 지어준 이름으로 통신을 하게 됩니다. 

-network create

docker network create [OPTIONS] NETWORK-NAME

 

-network connet

docker network connect [OPTIONS] NETWORK CONTAINER

네트워크 생성 -> 기존생성된 컨테이너 네트워크에 연결

위와 같은 과정을 거치면 네트워크에 연결한 컨테이너는 서로 통신을 할수 있는 준비가 됩니다.

 

ex)

docker run -d -p 8080:80 \ 
 --network=example \
 ...

ref. 인프런 강의. 초보를 위한 도커 안내서를 보고 참고하여 정리하였습니다.

 

Docker - 도커란 무엇인가

도커, 도커를 사용하는 이유, 도커의 특징 이해

wooody92.github.io

 

 

초보를 위한 도커 안내서 - 인프런 | 강의

도커를 1도 모르는 입문자, 초보자분들을 위한 도커 안내서 입니다. 복잡한 내용을 제외하고 도커가 왜 인기가 많고 어떻게 사용하는지 빠르게 익힐 수 있도록 집중하였습니다., 데브옵스 입문

www.inflearn.com

 

728x90

'기술 > Devops' 카테고리의 다른 글

aws(2)VPC(Virtual Private Cloud)  (0) 2022.04.19
aws(1)S3(Simple Storage Services)  (0) 2022.04.19
도커(4)-이미지  (0) 2022.01.19
도커(3)-도커 컴포즈  (0) 2022.01.17
도커(1)-도커란?  (1) 2022.01.13
728x90

1. 서버를 관리한다는것

  • 어떠한 프로그램이 동작할때 잘돌고 있지만 뒤 즉, 서버단은 매우복잡한 논리의 집합으로 돌아가고 있는것
  • 수많은 로직들중에 하나라도 잘못되어있을경우, 전체가 돌아가지 않는다
  • 서버를 관리한다는것은 이많은 논리의 집합을 오류없이 잘돌아가도록 관리하는것
    • 하지만 너무 잦은 개발환경의 변화로 인해 리소스의 낭비가 심해졌다
    • 이를 해결하기위해 도커가 등장했다.

2. 서버관리 방식의 변화

  • 전통적인 서버관리방식
    • user추가 -> system환경 -> 방화벽 -> ... -> proxy서버 -> 서버 실행
    • 매우 복잡한 여러 방식들을 하나하나 만들어 서버를 실행시켜야함
    • 이중 하나라도 문제가 생겼을때 전체적으로 오류가 발생함
  • 도커의 등장으로 인해..
    • user컨테이너, chat 컨테이너...와 같이 여러 기능들을 하나의 컨테이너처럼 독립적으로 실행시킬수 있음
    • 하나의 오류가 생기더라도 독립적으로 실행되고 있기때문에 문제가 없고 매우 효율적으로 서버 동작
  • 가상머신과 비교
    • 매우빠르다
    • 초기 환경 세팅을 일일이 할필요가 없다
    • 따라서 매우 효율적이다

3. 도커의 등장 배경

  • 서버 실행 방법 문서화
    • 서버를 실행할때 설치할 과정이나 주의점을 문서화를 통해 후임자나 다른사람에게 공유
    • 이문서가 정확할지? 누락된 부분이 있어 그대로 실행안됨...과 같은 문제점이 있음
  • 상태관리 도구 도입(chef, puppet, ansible...)
    • webserver, library등 문서로만 적혀있는것이 아닌 코드로 관리함으로써 환경을 공유하고 쉽게 설치 하게 개선
    • 각각의 서버, 여러 환경때문에 제대로 적용이 안되는 문제점이 있음
  • 가상머신
    • 여러 기능등을 각각의 가상머신에 설치한뒤 이 가상머신을 관리할수 있는 서버에 띄어둠
    • 한서버에 여러개 설치가 가능하고, 현재의 상태를 저장할수 있는 엄청난 이점
    • 처음부터 다시 셋팅할대 어려움이 있음, 매우느림, 공유하기 어려운 문제점이 있음
  • 도커의 등장!
    • 컨테이너: 격리된 환경에서 작동하는 프로세스
    • 하드웨어 가상화 기술보다 가벼움
    • 이미지 단위의 프로세스 실행 환경을 구성
    • 즉, 위의 여러 문제점을 모두 개선한 컨테이너 기술!

4. 도커의 장점

  • 확장성/이식성
    • 도커가 설치되어 있다면 어디서든 컨테이너 실행 가능
    • 쉽게 개발서버를 만들수 있고 테스트서버 생성또한 간편함
  • 표준성
    • 도커를 사용하지 않는 경우 여러 프레임워크로 만든 서비스들의 배포 방식이 매우 다양함
    • 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포 과정이 동일해짐
  • 이미지
    • 컨테이너를 실행하기위한 하나의 압축 파일과 같음
    • 이미지에서 컨테이너를 생성하기 때문에 반드시 이미지를 만드는 과정 필요
    • Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능
  • 설정관리
    • 설정은 보통 환경변수로 제어
    • 하나의 컨테이너를 띄울때 환경변수를 같이 지정
  • 자원관리
    • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화됨
    • 업로드 파일을 외부 스토리지와 링크하여 사용하거나 s3같은 별도의 저장소가 필요함

 

ref. 인프런 강의. 초보를 위한 도커 안내서를 보고 참고하여 정리하였습니다.

 

Docker - 도커란 무엇인가

도커, 도커를 사용하는 이유, 도커의 특징 이해

wooody92.github.io

 

초보를 위한 도커 안내서 - 인프런 | 강의

도커를 1도 모르는 입문자, 초보자분들을 위한 도커 안내서 입니다. 복잡한 내용을 제외하고 도커가 왜 인기가 많고 어떻게 사용하는지 빠르게 익힐 수 있도록 집중하였습니다., 데브옵스 입문

www.inflearn.com

 

728x90

'기술 > Devops' 카테고리의 다른 글

aws(2)VPC(Virtual Private Cloud)  (0) 2022.04.19
aws(1)S3(Simple Storage Services)  (0) 2022.04.19
도커(4)-이미지  (0) 2022.01.19
도커(3)-도커 컴포즈  (0) 2022.01.17
도커(2)-도커 설치와 실행  (0) 2022.01.17
728x90

팀협업 프로젝트를 하며 초반에 무슨 준비를 해야할지 고민이 많았다.

혼자서 프로젝트를 진행할때와 달리 나는 서버만 만들고 클라이언트 개발자, 기획자, 디자이너가 서로 분업을 하기 때문에 초반에 세팅에 관해 모를 분들을 위해 백엔드(서버)개발자의 관점에서 글을 정리한다.

 

1. 팀 협업 레포지토리 및 소통 수단 협의

-팀 협업 레포지토리

선택의 부분인데 따로 레포지토리를 파도 문제는 없지만 추후 공식적인 부분을 고려해 처음부터 organization으로 팀레포지토리를 만들어 서로 레포지토리를 공유한다.

 

GitHub에서 협업 용 단체(Organization) 만드는 방법

GitHub의 계정 종류는 크게 개인 계정과 단체(Organization) 계정으로 나뉩니다. 이 글에서는 단체 계정을 생성하고 단체에 속한 저장소 생성 방법을 소개합니다.

www.lainyzine.com

위의 블로그글을 보고 레포지토리를 파면 된다.

 

getitdeveloper

getitdeveloper has one repository available. Follow their code on GitHub.

github.com

나의 경우, 위와 같이 만들어 하나의 레포지토리안에 client와 server를 분리하여 만들어 뒀다. 이부분은 팀원끼리 협의를 하면된다.

 

-소통 수단 협의

전체적인 팀협업 진행률 같은 경우, 노션을 만들어 매주마다 회의록을 적었으며 그주차에 해당하는 목표치를 todo형식으로 만들어 서로 진행률을 체크하며 프로젝트를 진행한다. 그리고 slack을 많이 사용한다고 하는데 이부분은 서로 대화가 가능한 수단을 만들어야 하는것이기 때문에 카톡이든 따로 문제는 없으니 협의를 통해 결정하면된다.

 

2. api 서버 개설 및 인프라 구축

-api서버 개설

GCP, AWS와 같은 클라우드 서비스를 이용해 추후 배포할 서버를 먼저 개설한다. 여기서 중요한것은 로컬에서 진행은 API가 유효한지 테스트로 활용후 테스트가 통과되면 배포서버에 즉시 업데이트를 해줘야 클라이언트에서 바로바로 테스트가 가능하기 때문에 로컬-POSTMAN(자가 테스트) -> 배포 서버-클라이언트 개발자 순으로 자가테스트를 한후 클라이언트 개발자와 테스트를 진행하게 된다. 즉, 처음엔 NGINX와 같은 웹서버를 통해 본인의 프로젝트를 공유한뒤 SWAGGER와 같은 명세서 자동화 라이브러리를 활용하여 API명세서를 찍어준다. 

 

API 명세서 작성하기

라이징 프로그래머2의 4주차 과제 중 두번째인 API 명세서 작성을 진행해보았다. 직전 포스팅에서 REST API가 무엇인가, 에 대해서 공부를 하였다면 이번엔 직접 URI 및 요청과 응답, HTTP Method까지 모

velog.io

명세서는 들어갈내용이 API주소, request, response data내용등이다. 이부분은 클라이언트 개발자가 개발을 할때 타입을 지정해줘야하기 때문에 서로 협의를 통해 필요한 데이터를 결정하고 예시를 적어준다고 생각하면 된다. 위의 블로그를 참고하면 좋다.

 

-인프라 구축

개발을 본격적으로 들어가기전에 인프라구축의 경우 nginx, apache와 같은 웹서버를 통한 배포 https적용, DB서버, S3연동등 앞으로 개발간에 바뀌지 않을 부분등을 미리 설정해주는 편이 좋다. 중간에 DB가 바뀌면 많이 곤란한 상황이 생기니 DB서버먼저 연결을 잘해줘야하며, 웹 기반 프로젝트의 경우, 가장먼저 cors지정을 해줘야 클라이언트와 협업이 가능하니 이부분을 먼저 허용해주고, 앱 기반 프로젝트의 경우, 경험상 따로 지정을 해주지 않아도 문제는 없다. 그리고 https즉 인증서 적용의 경우, 요즘 보안상 필수이니 적용을 해주어야 하면 route53과 같은 서비스를 통해 도메인 까지 ip에 연결해주면 모든것은 끝난다.

 

3. 기획자와 디자이너

사실 개발 관련한 사항은 준비할점이 많지만 왠만하면 기획자, 디자이너 분들과는 많은 소통을 하며 최대한 맞춰주는것이 좋다. 개발 관련 지식은 모르면 구글링을 통해 왠만하면 도움을 얻을수 있지만 기획과 디자인 모두 상당한 스트레스를 요구하게 된다고 느꼈다. 그래서 왠만하면 협업 툴이나 회의 관련한 피드백은 최대한 맞춰주는것이 프로젝트 진행사항이 긍정적인 방향으로 흐를수 있는 방법이 아닐까?생각한다.

 

4.정리 (백엔드 개발자)

-레포지토리 개설

-배포시(s3,db,etc...)인증서를 적용한 배포

-클라이언트 개발자와 통신 확인(웹 기반 프로젝트의 경우, cors확인필수, 방화벽도 꼭 확인)

-api명세서 구체화

-기획자와 디자이너분들의 니즈 최대한 맞춰드리기!!

728x90
728x90

사실 나는 돈을 많이 벌고 싶다는 목표가 있다.

당장엔 취업할수 있는 가장 큰 방법은 개발자라는 직업이며 솔직히 개발하는것 자체가 즐겁다. 사람들과 소통하며 에러를 밤새서 수정하고 났을때 쾌감이 너무 좋다. 그리고 최종적으론 나만의 서비스를 만들어 창업을해서 좋은사람들과 팀을 꾸려 수익을 창출해보고싶다.

 

예전부터 혼자서 여행다니며 게스트하우스 파티에 참석하다보니 이렇게 즐거운 파티를 집근처에서도 모르는사람들과 진행할수 있는 서비스가 있으면 좋겠다라는 목적을 가지고 이번 bora팀을 꾸려 창업을 목표로 프로젝트를 진행하고 있는데 이번 기획회의 단계에서 이런걸 만들고 싶다 라는 목적만 있지 세부적으로 컨텐츠내용이 너무 부실하다는 피드백이 나왔다. 사실 어느정도 기획적으로 완성됐고 이제 네이밍만해서 디자인나오고 평소했던 개발을 통해 앱을 만드려고 했는데 당장 성공 할지 않할지 모르는 앱을 기획자분이 시간을 투자하기 힘들다는 피드백이 나와서 살짝 당황했다. 왜냐면 나보고 이 서비스의 확실한 컨텐츠가 뭐고 경쟁사와 비교했을때 특별한점이 무엇이냐? 라고 질문을 하셨는데 제대로 답을 못했기 때문이다. 그저 좋은 개발품을 만드려했지 좋은 서비스를 만드려고 노력을 안했다는 생각이 들었다..

 

20대초반부터 생각했던 아이디어였고 개발 실력이 늘면 내가 직접 개발해봐야지 라는 생각만 가지고 프로젝트에 임한것 같아 왠지 모르게 내 서비스에 미안해지는 마음이 생긴다. 

 

그래서 생각해본것이 당장 내목표가 무엇일까?였다. 개발자로 취업해서 돈을 버는거냐? 아니면 창업을 해서 성공을 하고 싶은거냐 였는데 당장은 개발자 취업에 목표를 정했던것 같다. 사실 요즘 현장실습이 종료된 이후 cs공부만 하면 된다라는 생각에 기획쪽은 내영역이 아니라고 공부시간외엔 아무것도 안하고 쉬고만 있었는데 쉬는걸 좀 줄이고 bora에 좀더 애정을 가지고 다시 열심히 창업도 준비 해봐야겠다.

 

결론! 현장실습이 종료된 이후 긴장이 풀려서 많이 논것도 사실이니 cs공부와 동시에 bora 프로젝트 개발만 신경쓸게 아닌  기획자분의 요구에 맞춰 열심히 기획부분도 참여를 해봐야겠다. 갑자기 든 생각인데 당장 1년뒤 내가 어디에 취업해서 무엇을 하고 있을지 궁금하다. 현재의 시간이 낭비 되지 않도록 열심히 살아야 겠다ㅎ..

화이팅!

728x90
728x90

드디어 나를 수개월간 괴롭혀 왔던 프로젝트 발표가 끝이났다~ 그리고 6개월간의 이스트시큐리티에소의 현장실습이 종료되었다!! 

2주간 진행량 및 2021년 회고

  • GETIT 프로젝트

함께 작업하는 클라이언트 개발자분이 당근마켓에 지원하신다고하셔서 부리나케 일단 기능개발에 초점을 맞춰 현재 만들어진 기능을 다듬는 작업을 진행했다.

 

-검색 기능 개발

최종적으로는 elasticsearch를 사용하여 기능을 개발하려고 했는데 아무래도 처음 다뤄보는 기능이기도 해서 시간이 오래걸릴것 같아 model filtering을 사용하여 간단하게 구현했다.

search = request.GET.get('search')
        common_paginator = WholeBoardCommonPageNumberPagination()
        recruit_paginator = WholeBoardRecruitmentPageNumberPagination()
        free_posts = CommonBoard.objects.filter(Q(title__icontains = search) |
      Q(content__icontains = search),category='free')
        free_posts = common_paginator.paginate_queryset(free_posts, request)
        free_serializer = CommonBoardSerializer(free_posts, many=True)
        question_posts = CommonBoard.objects.filter(Q(title__icontains = search) |
      Q(content__icontains = search),category='question')
        question_posts = common_paginator.paginate_queryset(question_posts, request)
        question_serializer = CommonBoardSerializer(question_posts, many=True)
        recruit_posts = RecruitmentBoard.objects.filter(Q(title__icontains = search) |
      Q(content__icontains = search))
        recruit_posts = recruit_paginator.paginate_queryset(recruit_posts, request)
        recruit_serializer = RecruitmentBoardSerializer(recruit_posts, many=True)
        return JsonResponse({
            "freeboard": free_serializer.data,
            "questionboard": question_serializer.data,
            "recruitboard" : recruit_serializer.data
        })

코드가 굉장히 길다. 반드시 리팩토링이 필요한 부분인것이다. 하하...

url로 넘어온 category파라미터는 말그대로 카테고리 구분에 사용되면 ,title, content기능을 django orm filter기능중 __contains라는 걸 사용해 필터링할 문자열이 속한 필드를 모두 가져오는것으로 구현하였다. 

 

-필터 기능 개발

이부분도... 굉장한 리팩토링이 필요해보이는데 일단은 노가다로 구현했다. 백퍼센트 어디 지원해서 면접볼때 까일것 같긴하지만.. 일단 시간투자해서 해결했다는데 의의를 두고...

		pm = request.GET.get('pm')
        developer = request.GET.get('developer')
        designer = request.GET.get('designer')
        category = request.GET.get('category')
        if category == 'free':
            if pm == 'true':
                if developer == 'true':
                    if designer == 'true':
                        posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 2) | Q(worker = 3), category='free').distinct()
                        paginator = BoardPageNumberPagination()
                        result_page = paginator.paginate_queryset(posts, request)
                        serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                        return paginator.get_paginated_response(serializer.data)
                    else:
                        posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 2), category='free').distinct()
                        paginator = BoardPageNumberPagination()
                        result_page = paginator.paginate_queryset(posts, request)
                        serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                        return paginator.get_paginated_response(serializer.data)
                else:
                    if designer == 'true':
                        posts = CommonBoard.objects.filter(Q(worker = 3) | Q(worker = 2), category='free').distinct()
                        paginator = BoardPageNumberPagination()
                        result_page = paginator.paginate_queryset(posts, request)
                        serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                        return paginator.get_paginated_response(serializer.data)
                    else:
                        posts = CommonBoard.objects.filter(worker=2, category='free').distinct()
                        paginator = BoardPageNumberPagination()
                        result_page = paginator.paginate_queryset(posts, request)
                        serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                        return paginator.get_paginated_response(serializer.data)
            elif designer == 'true':
                if developer == 'true':
                    posts = CommonBoard.objects.filter(Q(worker = 1) | Q(worker = 3), category='free').distinct()
                    paginator = BoardPageNumberPagination()
                    result_page = paginator.paginate_queryset(posts, request)
                    serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                    return paginator.get_paginated_response(serializer.data)
                else:
                    posts = CommonBoard.objects.filter(worker=3, category='free').distinct()
                    paginator = BoardPageNumberPagination()
                    result_page = paginator.paginate_queryset(posts, request)
                    serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                    return paginator.get_paginated_response(serializer.data)
            elif pm == 'false' and designer == 'false' and developer == 'false':
                res = {
                    'count': 0,
                    'next':None,
                    'previous':None,
                    'results': [],
                }
                return JsonResponse(res)
            else:
                posts = CommonBoard.objects.filter(worker=1, category='free').distinct()
                paginator = BoardPageNumberPagination()
                result_page = paginator.paginate_queryset(posts, request)
                serializer = CommonBoardSerializer(result_page, many=True, context={'request': request})

                return paginator.get_paginated_response(serializer.data)

매 조건 절마다 return한건 테스트용도로 해둔건데 마지막에만 당연히 리턴문 돌려주면되니 알아서 필터링해주세요ㅎㅎ

 

- member 기능 개발

import json

from django.http import JsonResponse
from django.shortcuts import render

# Create your views here.
from profiles.models import TeamProfile
from requests import Response
from rest_framework.generics import GenericAPIView

from .models import Member, WaitingForMember
from .serializers import WaitingMemberSerializer


class MemberAddView(GenericAPIView):

    def post(self, request):
        """
        팀원 추가(POST)
        ---
                {
                    'teamprofile': 2,
                    'member': 3
                }
        """
        requestData = json.loads(request.body)
        teamprofile_id = requestData['teamprofile']
        member_id = requestData['member']
        print(requestData)
        profile = TeamProfile.objects.get(id=teamprofile_id)
        member = Member.objects.create(member=member_id)
        wait_member = WaitingForMember.objects.get(teammember__id=teamprofile_id, waitmember=member.member)

        wait_member.delete()
        profile.members.add(member)
        res = {
            "message": "success"
        }
        return JsonResponse(res)


class MemberWaitingView(GenericAPIView):

    def get(self, request, teamprofile):
        """
                프로젝트 지원 대기 멤버 조회(GET)
                ---
                        {
                            'teamprofile': 2,
                            'waiting_member': 3
                        }
                """
        teamprofile_id = request.GET.get('teamprofile')
        teamprofile = TeamProfile.objects.get(id=teamprofile_id)
        wating_member = teamprofile.waitingmember
        serializer = WaitingMemberSerializer(wating_member, many=True, context={'request': request})
        return Response(serializer.data)

    def post(self, request):
        """
        프로젝트 지원 대기 멤버 추가(POST)
        ---
                {
                    'teamprofile': 2,
                    'waiting_member': 3
                }
        """
        requestData = json.loads(request.body)
        teamprofile_id = requestData['teamprofile']
        waiting_member = requestData['waiting_member']

        try:
            waiting_member = WaitingForMember.objects.get(teammember__id=teamprofile_id, waitmember=waiting_member)
            print(waiting_member)
            teamprofile = TeamProfile.objects.get(id=teamprofile_id, waiting_members=waiting_member)
            print(teamprofile)
            if teamprofile is None:
                raise Exception
            res = {
                "message": "fail"
            }
        except:
            teamprofile = TeamProfile.objects.get(id=teamprofile_id)
            waiting_members = WaitingForMember.objects.create()
            waiting_members.waitmember = waiting_member
            waiting_members.save()
            teamprofile.waiting_members.add(waiting_members)
            res = {
                "message": "success",
                'teamprofile': teamprofile_id,
                'waiting_member': waiting_member
            }

        return JsonResponse(res)

팀 프로젝트의 멤버 추가기능을 개발하는데에 있어 신청을 했을때 받는 멤버와 팀장이 수락하여 멤버가된 모델을 분리하였고 역참조의 개념을 한번 익히는데 도움이 되었다. 사실 이 역참조라는걸 생각안하고 항상 구현하다보니 코드가 지져분해졌었는데 나중에 다끝나고 리팩토링할때 많이 쓰일것 같은? 기능이다. foreignkey의 related_name을 설정하여 외래키로 참조된 모델에서 역으로 참조한 모델을 참조할때를 역참조라고한다. 시간이 좀많이 걸렸다.

 

Get IT

 

getit.best

이젠 어느정도 명함을 내밀수 있게 완성이 되었다. 알림과 채팅만 남았다!!!! 현재 기능으로도 나쁘지 않다고 생각한다~

 

-KOTLUCK

이제 제대로 시작했다. 한국형 파티문화를 만들겠다! 라는 멋진 포부로 POTLUCK의 이름을따 KOTLUCK으로 지었는데 여러 회의를 거쳐 보라(BORA)라고 결정지었다!!!! 무엇보다 기획자 포지션이 정말 중요한데 너무 좋은분이 오신것같아 나도 함께 열심히 하고 있는중이다. 개발에 있어선 아직 세부기능이 확정이 안되서 일단 FCM을 활용하여 채팅, 알림기능 개발중이다. 이제 시간이 넘쳐나는 백수가 되었으니 졸업전 창업이라는 목표로 열심히 다시 불태워봐야겠다~~

 

 

-인턴

할말이 참많다.. 일단 엄청난 스트레스였던 패치랩 시연 및 발표가 끝이났다. 한20여분이 구글미트에 들어오셔서 보셨는데 많이좀 떨었고 개발을하며 ppt만들일은 없을줄알았는데 ppt까지 만들어서 발표하게 되었다. 리드님이랑 사수님이 질문때 많은 지원사격을 해주셨다는 생각이 들었고 두분은 모르시겠지만 사실나는 정말  감사했다ㅎㅎ 그리고 무엇보다 6개월간의 인턴 즉 현장실습이 종료되었다! 맨처음 글을올렸던 올해 6월말에 업무에 있어 조금이라도 도움이 되는 인턴이되자!라고 마음 먹었는데 다른 팀원분들도 그렇게 느끼셨으려나 모르겠다..ㅎ... 자주 실수도 하고 모르는것도 많아서 질문 투성이였는데 화한번 내지않고 모두 친절하게 알려주신 팀원분들께 그저 감사할 따름이다. 지금와서 생각해보면 업무가 정말 많다고 혼자서 불평도 했었고 초반에 엄청난 열정에 비해 조금은 게을러지고 했던것 같기만 하다. 사실 6개월간 많은 일이 있었고 처음으로 자취라는 것도 경험을 해서 후회되진 않는시간이었다. 무엇보다도 6개월전 무급이라도 개발자분들과 일을 함께 해볼수 있는 기회가 있었으면 좋겠다라고 생각도 했었고 불합 통지를 받았지만 추후 면접을 보지 않겠냐고 선뜻 다시 물어봐주신 pms-mpi셀 팀원분들한테 너무 고맙기만 한것같다. 자취라는 꿈과 개발일을하며 돈을 벌 첫기회를 준 기업이다. 사실, 일을 하기전 직급에 따라 불합리한 상황이 벌어지는것이 조금은 당연한거라 생각했는데 이스트시큐리티에서 일을 하며 정말 내가 잘못생각했구나!라는걸 느꼈다. 나에게도 중요한 업무를 할당해주시고 내의견을 조금이라도 무시하는 경향이 전혀없었으며 직급이 높다고 해서 불합리한 상황이란게 전혀없었다. 모든분들이 의견을 낼수 있으며 피드백을 바로바로주시고 정말 자유로운 분위기의 회사였다. 물론 기술스택이나 목표로 잡았던 기업이아니라 당장은 지원하진 않겠지만 회사생활을 해보면 이스트소프트라는 기업 정말 좋은 회사인걸알수 밖에없다. 개발자에서 대표가 되신 대표님부터 시작해서 현장실습생까지 모두가 동등한 위치에서 자신의 능력을 한껏 뽐낼수 있는 회사라고 생각한다. 많이 힘들었기도 했지만 얻은것도 많았던 터라 이제 막 나왔는데 아련한 기분이 든다ㅎㅎ.. 다만 걸리는건 중간에 이슈가 발생해서 업무를 다못끝냈다는거..? 많이 못끝내고나와 아쉽고 죄송하기만 하다....

 

-2021 회고

앞에 주저리 주저리 썻지만 요약하자면

  • 6개월간의 자취생활과 꿈에 그리던 인턴을 해냈다!
  • 한번은 제대로 완성해보고 싶었던 getit 프로젝트를 완성해냈다!

-2022 목표

  • 창업 : BORA로 창업이 목표다. 당장 어떻게 하는진 모르겠다. 일단 앱개발해서 대회도 나가보고하고싶다.
  • 졸업: 졸업이다. 코스모스 졸업인데 일단 정처기따면 졸업일테니 정처기가 목표인가?ㅎ..
  • 취업: 학생이지만 내생각엔 취준생이 맞다 좋은회사가서 발전하고 싶다. 좋은회사 갈꺼다
    • cs, 알고리즘 공부좀 개학전까지 끝내두기!
    • django이외에 다른 무기하나더 장착해두기!
  • GETIT 광고달기: 에드센스 달고 싶다. 알림, 채팅기능달면 다른 스터디 모집엔 비교할수 없는 최고라고 자신한다. 광고비 받아서 서버비용이라도 충당하고 싶다ㅎㅎ...
  • 여행: 사실 생각보다 돈좀 많이 모은것 같아 1달간 돈다쓰고올꺼다. 제주도가서 앞으론 쉬고싶지 않을정도로 좀 쉬다와야겠다.

필수적인것만 적었는데 다이뤘음 좋겠다!! 2022년도 화이팅!

그리고 2021년은 너무 그냥 고마운 한해였다!!

-끝-

 

+)사실 WIL컨텐츠는 아무래도 잠시 멈추려한다... 한번에 몰아쓰는 경향이 있는것 같아서 뭔가 제대로 매일 공부할만한 것이 생기면 그때 진행할꺼다ㅎㅎ....... 일단 남은기간동안 연합동아리 지원, 정보처리기사 공부, 프로젝트 진행이 대다수 일듯해서?? 일단 잠시는 멈춘다.. 다음에 시작하면 WIL이 아닌 TIL로 복귀하길...ㅎ

728x90
728x90

허허... 나약한 의지박약이 아니라 그냥 바빳던거다 ㅎ... 매일 쓰기로했지만 귀차니즘 + 일정상의 빡빡함 때문에 쓰지를 못했다. 인턴일이 꽤나 고되고 힘든것같다. 앞으로 15일여정도 남아있는데 유종의미를 얻고 싶다허허.... 

그리하여 어차피 매일 못쓴다면 적어도 매주쓰자! 라는 취지하에 TIL -> WIL로 변경하였다. 나중엔 MIL로 그리고 나중엔 YIL로..?ㅎ... 암튼 가장 많이 진행된건 인턴업무다... 약 3개월여간 기획후 개발까지 많은 발전이 있던것 같은데 최종시연전 팀원분들께 시연을 해보자!라고 리드님께서 말씀하셔서 약 한달간 또 밤을 새가며 이리저리 고쳤고 반은 성공으로 마무리 하였다. 최종시연은 약20여분 앞에서 시연하기로 했는데 그게 앞으로 1주일도 남지 않아서 이래저래 부담감은 크지만 그동안의 실수를 만회할 찬스라고 생각되기 때문에 유종의미를 얻을수 있는 절호의 찬스라 생각하고 열심히 준비하고 있다! 아마도 다음 WIL은 시연이 끝나고 멘탈탈탈 털린 상태로 작성하지 않을까?싶다. 일단 그동안 진행사항은

 

한주간 진행량

  • GETIT 프로젝트

-HTTPS적용

사실 이부분은 지난번에 했던건데 하다보니 제대로 적용이 안됐었다. client분과 잠시 일정상 프로젝트 중단했다 혼자서 하다보니 이부분을 모르고 있었는데 결국 또다시 2주간 삽질후 적용에 성공하게 되었다. 이것관련해서는 잊지 않기 위해 따로 블로그에 포스팅해뒀다.

 

drf nginx gunicorn https적용하기(react-drf)

프로젝트를 진행하며 거의 2주간 삽집을 해낸끝에 https적용을 끝냈다. 대부분의 블로그에서는 django풀스택 개념의 https적용이였기때문에?? 나와는 맞지않는 방법만 있었기 때문에 어려움을 겪었

leeceo97.tistory.com

-소셜로그인 수정

https를 적용하며 구글,카카오,깃허브 3가지 소셜로그인 모두 에러가 발생했다. 당연히 요청하는 주소가 변경되서 문제가 생긴거라 손쉽게 고쳐질줄 알았는데 그게 아니였다... 깃허브, 구글을 문제가 없는데 카카오같은경우는 지금도 현재 수정을 못해서 또 밤새고 있는 중이다. 그리고 예를들어, test@gmail.com이라는 구글 계정이 있고 test@gmail.com이라는 깃허브 계정이 있으면 서버에 오류가 발생하는 문제가 있어서 이부분을 수정하게 되었다. 이것관련해서는 진짜 회사 프로젝트 시연하고 나서 소셜로그인 총정리!!라는 주제로 포스팅을 할예정이다(계속늦어지는것 같은건 느낌탓인가..ㅋ)

 

-세부 API수정

CLIENT개발자분중 한분이 취업을 하게 되며 한분이서 작업을 하다보니 지체된 감이 있는데 작업을 진행하시다 API에 추가 요구사항이 좀 많이 생겼다. 그래서 이것저것 고쳤고 현재도 고치고 있는중이다.

 

나에게 개발자를 준비하는데 있어 변곡점이 된 GETIT프로젝트 이므로 완성도 높게 올해안에 꼭! 마무리 지을것이다.

 

  • 인턴

-패치랩 개발

할많하않... 너무 고되고 힘들고 스트레스 이빠이 받는다.. 처음 하는 분야가 너무 많아서 힘들고 그렇기 때문에 레퍼런스또한 없어서 많이 삽질중이다. 그래도 처음으로 REACT로 기능개발을 해봤고 REST통신간에 반복문을 돌려 원하는 값이 나올때까지 계속해서 요청을 보낼수 있구나! 회사에서 요구사항이 있을땐 이렇게 행동해야 하구나!라는걸 수없이 고통받으며 많이 느끼고 있는중이다. 이에 대한 설명은.. 나중에 최종시연이 마무리 되고나서 모든걸 적어낼것이다.. 무조건 깃헙에 결과물 올린다 하...... 애증의 패치랩 꼭 마무리짓자..........................

 

  • kotluck

-

기획사실 팀원들에게 정말 미안한 부분이기도하고 감사하기도 하다. 회사프로젝트에 치여서 시간이 없고 getit프로젝트가 마무리되서 시작한 프로젝트였는데 getit도 일정안에 끝내지 못해서 가장 후순위로 밀린데다 내친구를 불러와 기획자 포지션에 두고 진행중인데 많이 신경을 못썻는데도 불구하고 각자가 그래도 열심히 해주고 있는것 같다. 현재 기획단계에서 세부화가 정확히 안되서 여전히 기획 진행중이며 클라이언트 개발자 두분은 다행히? 바쁘셔서 일단은 쉬고 계신다 다음주부터 개발 다시 들어가겠다고 말씀드렸으니 기다려주신만큼 열심히 잘만들어봐야겠다.

 

다음목표

  • getit

-소셜로그인 정상화

-api수정

 

  • 인턴

-패치랩 시연 가능하도록 개발 및 개발문서, 프로젝트 설명안 작성

 

kotluck은 잠시 쉰다.. 팀원분들 정말 미안합니다 ㅠ... 

일단 다음주에 글을쓸때는 내가 너무 자랑스러워서 자존감 만땅인 상태로 WIL?일기인가...암튼 글작성하길 바라며 글을 마친다!!!!

728x90

+ Recent posts