일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 42seoul
- Spring
- 데이터베이스
- AI
- libasm
- 아이패드다이어리
- JPA
- 스프링부트 웹 소켓
- 스프링부트
- sql
- Xcode
- javascript
- CD
- 오블완
- 소켓
- jenkins
- DBMS
- 프로그래밍언어론
- 다이어리
- swift
- CI
- 네트워크
- 스프링
- IOS
- 티스토리챌린지
- 인공지능
- MySQL
- springboot
- 리눅스
- 오라클
- Today
- Total
목록프로젝트 개발 일지 (11)
Hi yoahn 개발블로그
42gg 프로젝트에 처음 들어간지 1년이 다 되어간다. 들어가게 되었던 계기는 취준만 하니까 지루하고 쳐져서 하게된것도 있었고, 실제 서비스 운영 경험을 갖고 싶었다. 3기로 들어갈때 쯤에는 운영 경험이라고 하면 뭔가 대단해보이고, 깊은 지식을 얻을 수 있는 것들을 기대했었다. 근데 막상 3기로 들어가서 개발을 해보니까 그냥 개발이랑 뭐가 다른건지 의문이 들었던것 같다. 그런데 개발하다 보니 운영중에 발생하는 버그도 마주치며 해결해보고, 기능 개선을 위해 팀을 설득시키는 경험도 해보면서 그냥 하고싶다고 할 수 있는것도 아니고, 그걸 지금 해결해야할 만큼 중요한 일인가도 생각해보게 되고, 다른 사람들을 설득시키려다보니 이제 왜?라는 물음에 그냥!이 아니라 명확한 이유와 근거를 들어야 한다는 것도 깨달을 수..
42gg 3기 개발을 마치고 4기 분들한테 인수인계를 했지만, gg 서비스가 운영되는 서비스다 보니 aws 에 올라가 있는데 거기 접근을 잘 하는 사람이 많지 않기도 하고 해서 계속 GG를 다른 팀원 한명과 유지보수를 해왔고, 그러다 프로젝트 리더를 맡게 되었다. (다들 부담스러워 하기도 하고 해서 내가 하게 됐다.) 근데 막상 PL 까지 맡으니까 좀 더 개선할 점이나 해결해야 하는 일들이 보이기 시작했고, 그래서 몇가지 이슈를 진행했다. 일단 가장 먼저 해결했던 부분은 슬랙봇. 42 서울 슬랙에 슬랙봇을 추가하여 예약 관련한 알림을 보내려고 했는데, 이걸 하려면 파리에 있는 관리자와 연락을 해야 했다. 근데 파리가 일처리를 빨리 해주는 편은 아니라서 오래 걸렸던 것도 있었고, 해당 관리자 계정이 이름이..
42GG 3기때 리팩토링을 하면서 몇가지 규칙을 정했었는데, 그중 하나인 Builder 패턴에 대한 글이다. 먼저 현재 팀에서 정한 규칙은, Builder 호출을 컨트롤러단, 서비스 단에서는 금지하는 규칙이다. @Builder 패턴의 장점 먼저 builder 패턴의 장점을 알아보자 내가 생각하는 장점 매개변수 명시적 지정 매개변수가 많은 생성자의 경우, 타입이 같은 매개변수가 여러개가 있다면 각 위치에 어떤 값을 넣느냐가 매우 중요해진다. 이때 리팩토링을 하다가 원래 있던 위치의 매개변수가 생성자 내에서 같은 타입이지만 다른 역할로 변경되었다면, 프로그램 실행에는 문제가 없기 때문에 버그를 잡기 어렵다. 하지만 builder 패턴을 사용하면 어떤 멤버변수를 초기화 할건지를 명시적으로 지정하게 되어 생성자..
리팩토링을 목표로 시작했던 3기, 리빌딩으로 마무리했다. 탁구 매칭 & 랭킹 시스템으로 42Seoul 카뎃들을 대상으로 하는 서비스이고 작년쯤부터 개발했던걸로 알고있다. 1기때 메인 기능 개발하고 2기때는 관리자 기능이 추가됐다. 나는 3기때 들어오게 되서 기존 서버 구성을 늦게 알게 되었는데, OAuth 를 잘못 사용하고 있는 부분(안쓰고 있는 것과 마찬가지였다.)과 데이터베이스 정규화 제대로 안되어있는 부분들(외래키가 불필요하게 많이 걸려있는 부분, 컬럼은 있는데 값이 아예 안들어가는 부분,,)로 인해 3기 온보딩 중에 설계문제로 디비에 똑같은 데이터가 두번 들어가는 문제가 있었다. 또한 코드 리팩토링을 해야하는데 안쓰는 클래스 파일도 몇개 있는데 양이 많고 기존 코드에 대해 완벽히 이해하고 있는 사..
이번주에 두번째 스프린트가 종료된다. 사실 그동안 개발을 할때 일단 빨리 하고 코드는 나중에 개선하면 된다는 생각을 가지고 있었는데, 잘못된 생각이었던것 같다. 시스템 자체 복잡도가 낮지 않은 프로젝트인데, 좀만 복잡한 api 를 구현할 때가 되면 머리로만 생각해서 짜는게 쉽지 않다. DB join 쿼리부터 복잡할때도 있고 이것저것 고려해야 할 요소가 많은데 어디 페이지에서 어떤 용도로 쓰는거라는 설명 한줄 가지고는 부족하다. api 하나를 예시로 들면, 게임 종료되면 랭크게임의 경우 같은 게임을 한 두명에게 동시에 입력받아서 그 점수가 같을 때에야 ELO 시스템을 통해 탁구력을 계산한다. 그런데 42gg 서비스는 랭킹 조회 성능 개선을 위해 Redis 를 사용하고 있다. 그래서 탁구력을 계산하면, 그 ..

기존 시스템 분석하면서 왜 이렇게 되어있나 싶은 로직과 DB를 마주하였다. https://www.figma.com/file/uiJL8G0rKLp8ZIJc5Rj7Fy/42GG?node-id=0%3A1&t=MIs1LoNUqxts1I5o-1 DB가 제일 심각했는데, 실제 DB와 ERD가 차이가 있기도 했고, user 테이블의 외래키를 id(INT) 를 거는 테이블과 intra id (VARCHAR)를 외래키로 거는 테이블의 공존하는 상황이었다. 원래 42gg 3기 프로젝트 진행 목적은 리팩토링이었다. 성능 개선이나 코드 가독성 향상을 목표로 하고 있었는데, 레거시 파악을 하다 보니 시스템 개선이 시급하다고 생각했다. 깔끔하지 않은 뼈대를 고치다보면 누더기가 될 뿐,, 하나의 외래키를 여러 테이블에서 가지고 있..
https://ozofweird.tistory.com/entry/Spring-Boot-Spring-Boot-JWT-OAuth2-2 [Spring Boot] Spring Boot, JWT, OAuth2 (2) 1. 환경 구축 - docker-compose.yml version: "3.7" services: db: image: mysql:latest restart: always command: --lower_case_table_names=1 container_name: local_mysql ports: - "13306:3306" environment:.. ozofweird.tistory.com 위 글을 따라서 로그인 예제를 진행했다. import lombok.extern.slf4j.Slf4j; import ..

기존 VARCHAR 타입에 적는 숫자가 바이트 단위의 길이라고 알고있었는데 최근 프로젝트를 하다가 새로운 사실을 알게되었다. VARCHAR 의 열 크기는 mysql 버전 4.1 이후부터 문자 수로 바뀌었다. VARCHAR(10) 이면 10글자 입력이 가능하다는 이야기이다. 한글, 영어 상관 없이 글자수로 체크된다. 실제로, 테이블에 데이터를 입력한 뒤 아래의 쿼리문을 쳐봐서 확인해볼 수 있다. select CHAR_LENGTH('안녕하세요 반가워요') from dual; 결과) https://dung-beetle.tistory.com/26
[spring 오류] Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'securityConfig' defined in URL [jar:file:/home/g20181031/serverBuild/croffle-0.1.1-SNAPSHOT.jar!/BOOT-INF/classes!/com/sungshin/croffle/config/SecurityConfig.class]: Unsatisfied dependency expressed through constructor parameter 2; nested..

프로젝트를 진행하는 과정에서 배포를 내가 담당했는데, 서버에서 매번 git을 통해 jar 파일을 다운받아서 작성해둔 쉘 스크립트를 실행시키는 방식으로 했었다. 그런데 어쩌다가 나 말고 같이 진행하던 다른 사람이 배포를 시도하게 된 일이 있었는데, jar 파일 만드는 것부터 bitbucket이라 git url 접근 권한도 다르고 여러 문제가 발생하면서 멘토님이 내가 없어도 배포가 가능할 수 있게 Jenkins를 적용해보라고 인스턴스를 띄워주셔서 젠킨스를 통해 CI를 적용해 보게 되었다! 젠킨스는 요약하면 특정 브랜치에 올라온 커밋을 인식해서 젠킨스에서 풀 받아오고, 풀 받아온 코드를 가지고 빌드해서 쉘 스크립트를 실행하는 것 쉘 스크립트에 따라 배포 방식이 결정되는것 같다. 먼저 젠킨스를 사용하려면 젠킨스..