1개월 간의 브랜디 인턴십이 끝났다.
부담이 컸지만, DB 관리와 에러관리, 현업에서 일하는건 어떤지 많이 배울 수 있는 시간이었다. 인턴십에 관련하여 느낀점을 나누고자 한다.
1,2차 프로젝트와 달리 기업협업은 브랜디 회사 내에서 진행이 되었다.
첫날부터 위코드에서 진행했던 프로젝트와는 다른 긴장감과 초조함이 흘렀다.아무래도 채용연계형 인턴이었기 때문에 잘하고자 하는 부담감이 있었다.
과제는?
기업협업의 과제는 Admin 페이지 클론 프로젝트였다.
시작은 모델링!
1,2차 프로젝트의 모델링은 정말 아무것도 아니었다는 느낌이었다. 모델링은 생각보다 더 어렵고 복잡하고 어렵고 어려웠다..^^
그래도 Admin 페이지의 모델링을 하며 새로운 개념들도(예:선분이력) 배우게 되었다. 아래 사진처럼 모델링의 수량이 확연히 늘어났다.(사실 이 모델링도 많이 부족하다.)
해당 모델링을 하면서 가장 큰 배움이 있었는데, 바로 경험이다. 1,2차 프로젝트를 할때 유저 관리는 회원가입을 위해 단순히 비밀번호 등 개인정보만 관리하면 된다고 생각했다.
그러나 이번 프로젝트에서는 Admin 페이지를 하면서 회원정보의 이력, 수정, 삭제, 삭제된 정보의 기록 유무까지 데이터에 남겨야 했다. 그리고 token을 통해 master(관리자)인지 seller(셀러)인지 확인하는 것 등 회원 관리에도 정말 여러가지 가공해야할 데이터가 많다는 것을 알게 되었다. 그런데 이 모든 것은 직접 내가 경험하지 않고는 확인할 수 없던 것이었다.
경험하지 못했던 것이지만 모델링을 한 후 브랜디 팀장님께서 모델링을 분석하고 리뷰해주셨다. 팀장님께서 알려주신 문제점들을 통해 직접 서비스를 만들어서 경험하지 않았지만 회원 관리를 위해 필요한 모델이 무엇인지, 어떤 부분이 중요하고 부족했는지 확인할 수 있었다.
따라서 이번 브랜디 인턴을 경험하면서 우리가 직접 경험하지 못해 짤 수 없었떤 모델링을 리뷰를 통해 경험해본게 정말 큰 이득이었다.
물론 리뷰를 통해 모델링을 잘 만들었다고 생각했지만, API를 작성하면서 모델링의 문제점은 끊입없이나왔다.
NULL 값 처리, DEFAULT 값 설정, 소프트딜리트 설정,새로운 모델 생성 등 모델은 API를 만들며 계속 수정되었다.
그러나 이번 프로젝트는 Flask로 진행되어 DB 테이블의 경우 Schema 폴더로 설정을 해주어 InnoDB 엔진으로 테이블을 손쉽게 변경할 수 있었다. 물론 DROP과 CREATE 를 반복하긴 했지만, schema 폴더를 만들어 테이블 SQL을 관리하면 초기 모델 설정 때 편리한 점이 있었다.
결론적으로 모델링을 하면서 느낀 것은 현업에서는 모델링을 정말 중요하게 생각한다는 것! 그리고 모델링을 대충하면 실수는 바로바로 나와 서비스가 엉망이 될 수 있다는 것! 현업에서는 대충대충 뭔가를 만들어내는게 아닌 집중과 노력으로 무언가를 만들어내고 있다는 것!을 배웠다.
이번 인턴십을 하며 가정적으로나 개인적으로나 심리적으로 불안정한 상황이 조금 생겼다.
이런 상황에서 엎친데 덮친 격으로 API도 잘 만들어내지 못했다.
회원가입 API를 만드는데 오류가 너무 많이 나고 하나를 하더라도 제대로 해보고 싶어 시간을 너무 많이 투자한 탓이다. 물론 회원 가입 API를 만들며 DB connection과 transaction의 개념, 에러처리 등 많은 것을 배웠다.
짧은 시간에 어느정도 기능 구현을 많이 진행해야했는데 그렇지 못해 심리적으로 부담이 생겼고, 결국 하루는 몸이 안 좋아 회사에 가지 못하는 상황까지 생겼다.
성실함하면 빼놓지 않았던 내가 건강 때문에 회사를 빠지다니 .. 마음이 많이 불편했다.
그리고 이 날 이후로 업무 내적+외적으로 멘탈관리와 체력관리가 정말 중요하다는 말로 실제로 체감했다.
개발자라는 직업이 쉬운 직업은 아닌것 같다. 무언가를 만들어내야 한다는 압박감과 시간 안에 해야한다는 부담이 크다.이러한 상황 속에서 잘 버티기 위해서는 멘탈,체력관리 즉 건강관리가 정말 중요하다!
한번 몸이 아프고 나니 신체적으로 정신적으로 관리를 하기위해 실제적으로 운동도하고 정신적으로 마음도 평안하려고 노력했는데, 이러한 노력때문인지 별 탈 없이 과정을 잘 끝냈다. 건강하지 않으면 내가 좋아하는 개발도 못한다는걸 알게 되었다는 것만으로도 정말 값진 경험이었다.
1개월의 인턴십을 돌아보면 배운것도 많지만 아쉬움도 많이 남는다.
특히 궁금하고 진행하기 어려웠던 부분들이 많이 있었지만 혼자 해결해보고자 하는 마음 + 틀리면 어쩌지? 라는 마음 때문에 질문을 많이 하지 못했다.
물론 함께 했던 동기들과 같이 이야기하고 구글링을 하면서 문제를 해결했지만, 좀 더 명확하게 문제를 해결하고 답을 줄 수 있는 현업에 계신 팀장님께 많이 질문하지 못했던게 아쉽다.
앞으로 개발자로 성장하기 위해 적극적인 마인드로 소통하며 내가 모르는 걸 정확히 물어보고 확인하여 답을 얻어야겠다.
1,2차 프로젝트를 하면서 파이썬이 무엇인지, 장고를 어떻게 활용하면 되는지 조금 알게되어 자신감이 올랐다면, 이번 브랜디 인턴십은부족한 점이 너무 많이 들어나서 더 열심히 해야겠다는 욕심을 만들어주었다.
프로젝트를 하면서 백엔드에서는 파이썬+플라스크를 썼고, 자바스크립트와 리액트+스타일 컴포넌트를 활용해 프론트 일부 페이지도 만들었는데 현업에서 원하는 기능을 구현하기 위해서는 지속적으로 공부로 부족한 부분을 채워야한다는 것 느꼈다.
물론 처음 경험하는 플라스크를 1달동안 공부하여 API까지 만들어낸 자신을 칭찬하지만, 더 좋은 실력으로 더 많은 API를 만들어냈으면 하는 욕심과 아쉬움이 크다. 팀원들과 더 많은 것을 할 수 있었는데 그렇지 못했던 것 같다.
이번 인턴십을 하면서 가장 크게 느낀건 아무리 내가 좋은 사람이더라도 실력이 뒷받침 되지 않으면 동료들과 함께 일하며 좋은 결과물을 낼 수 없다는 것이었다.
저번 2차 프로젝트 회고록에 이런 글을 썼었다.
- 같이 일하고 싶은 개발자!
이런 개발자가 되기 위해서는 나에게만 집중하면 안 된다.
실력 성장은 기본이다.
성장에만 초점을 맞추지 않고, 주변에 같이 일하는 개발자들과 함께 가기위한 노력을 하자.
이 글은 여전히 유효하다! 그렇지만, 우선은 내 성장에 초점을 맞춰야겠다.
내 실력이 지속적으로 성장되지 않으면 주변에 도움을 줄수도 없고, 주변 개발자가 나와 함께하고 싶지도 않을 것이다.
기획자가 원하는 기능과 프론트가 받기 원하는 구조로 데이터를 보낼수 있는 개발자가 되자. 이런 실력이 뒷받침 되면 소통이 더 원활해질 것이고, 함께 하고 싶은 개발자가 될 것이다.
아래 코드는 회원가입시 전달된 seller_info 데이터를 입력하는 model_dao 내부의 코드이다. 함수를 3개로 만들었다가 transaction에 오류가 생겨서 1개의 함수로 한번에 transaction을 진행하기 위해 lastlowid 를 썼다.
사실 이 코드가 효율적인 코드라고 말할 수는 없겠지만, db 관리를 한번에 진행하여 무결성을 보장한다는 점에서 기억하고 싶은 코드이다.
def signup_account(self, seller_info, db_connection):
"""회원가입시 전달된 데이터 입력
Args:
seller_info: controller에서 받은 셀러정보 변수
db_connection: DB 커넥션 변수
Returns:
identification service로 전달
Authors: 홍성은
History:
2020-10-26 : 초기 생성
2020-10-27~28 : 오류, SQL 수정
2020-11-04 : insert_sellers,insert_managers 매소드 분리 했을 때 커밋에 문제가 생겨
lastrowid를 사용하여 signup_account 메소드로 합침.
"""
with db_connection.cursor(pymysql.cursors.DictCursor) as cursor:
insert_accounts_query = """
INSERT INTO accounts(
identification,
password,
account_type_id
)VALUES(
%(identification)s,
%(password)s,
2
)
"""
# SQL문 실행 및 기입
# account 정보 기입
cursor.execute(insert_accounts_query, seller_info)
# 새롭게 생성된 id 값을 가져옴
account_number = cursor.lastrowid
seller_info['account_id'] = account_number
insert_sellers_query = """
INSERT INTO sellers(
contact,
account_id,
attribute_id,
status_id,
korean_name,
english_name,
cs_contact,
updater_id
) VALUES (
%(contact)s,
%(account_id)s,
%(attribute_id)s,
1,
%(korean_name)s,
%(english_name)s,
%(cs_contact)s,
(SELECT accounts.id FROM accounts JOIN sellers AS s ON accounts.id = s.account_id WHERE identification=%(identification)s)
)
"""
# 셀러 정보 기입
cursor.execute(insert_sellers_query, seller_info)
seller_account_no = cursor.lastrowid
seller_info['seller_id'] = seller_account_no
# 담당자 정보 생성
insert_managers_query = """
INSERT INTO managers(
contact,
seller_id,
ordering,
updater_id
) VALUES (
%(contact)s,
%(seller_id)s,
1,
(SELECT id FROM accounts WHERE identification=%(identification)s)
)
"""
cursor.execute(insert_managers_query, seller_info)
return jsonify({"message": "SUCCESS"})