글을 쓰게 된 이유 우아한테크코스(우테코) 커디 팀에서 배포자동화를 구성하면서 고민이 하나 생겼습니다. GitHub Actions를 사용하면서 runner 가 설치되어 있는 서버에 jar 파일을 전달하기 위해 artifact를 사용했습니다. 하지만 artifact를 사용하게 되면 해당 레포에 접근 권한이 있는 사람들, 더 나아가 organization에 포함되어 있으면 organization 사람들 모두 jar 파일을 다운로드할 수 있게 됩니다. 이게 위험한 이유는 jar 파일을 unzip 하여 내부 파일을 볼 수 있기 때문입니다. 결국 해결해야하는 점은 artifact를 사용하지 않고 jar 파일을 서버에 옮겨야 하고, 서버마다 필요한 설정 파일(yml 및 key)들을 감춰야 합니다. 현재는 yml 파..
글을 쓰게 된 이유 이번에 우아한테크코스에서 커디라는 팀으로 프로젝트를 시작하게 됐습니다. 개발 관련 컨퍼런스들을 조회할 수 있고, 다른 사람들에게 같이 가기 요청을 할 수 있습니다. 이때, '같이 가기 요청'에서 알림 기능이 필요했습니다. 알림 기능을 구현하면서 Firebase를 왜 사용하게 됐는지, 어떻게 사용하는지 등 팀원들에게 공유하기 위해서 해당 글을 작성했습니다. 왜 firebase인가? 알림 기능을 구현하는 방법은 웹소켓, SSE, Polling 등이 있지만 왜 firebase를 사용했을까요? 현재 우테코의 데모데이 간격은 2주이기 때문에 새롭게 기능을 만들기에는 일정을 맞출 수 없다고 생각했습니다. 그래서 새로운 바퀴를 만들기보다는 존재하고 있는 바퀴를 아름답게 사용하기 위해서 fireba..
글을 쓰게 된 이유 우아한테크코스 근로 프롤로그를 맡게 되면서 초반에 코치님들에게 "꿈을 펼쳐도 되나요?"라고 여쭤봤었다. 가능한 꿈은 펼쳐도 된다라고 답변도 해주셨고,, 그래서 옛날부터 모니터링을 한번 해보고 싶어서 이번 기회에 구축해 보고자 프롤로그 코치님들을 꽤 괴롭혔다,, DM으로 로컬에서 해보았다면서 간접적으로 인프라에 대해 여쭤보기도 하고,, 먼저 로컬에서 연습해보고 나서 나중에 AWS 권한이 생기면 DEV에 먼저 구축해보려고 한다.(7/6 ~ 진행 중) "로컬에서 미리 연습하면 DEV 환경에서 더 편하게 할 수 있지 않을까?"라는 생각과 함께 같이 근로하는 크루원들에게 모니터링을 하면 이런 걸 볼 수 있다 + 어떻게 했는지 알려주기 위해 글을 작성해 봤다. 왜 이러한 툴들을 사용했나요? 다른..
벌써 레벨 2가 끝나고 방학이 왔다. 이번에는 레벨 1과 다르게 미션마다 회고를 하지 않고 나의 레벨 2에 대한 회고를 작성해보려고 한다. 레벨 1과 레벨 2의 다른 점 레벨 1 때 객체지향 공부가 너무 재밌었다. 미션마다 새로운 것들을 많이 경험하고, 크루원들마다 구현한 코드가 다 달라서 코드를 보는 것이 흥미로웠다. 옛날에 정리되지 않았던 것들이 하나둘씩 정리되는 느낌이 너무 좋았다. 틀 없이 자유분방하게 뛰어다니는 코드를 작성하고, 보고, 리뷰를 받았었다. 하지만 레벨 2에서 스프링 부트를 만나면서, 레벨 1 때 배운 객체지향과 다르게 '틀'이라는 것이 생긴 느낌이었다. 그 '틀'이라는 것을 누가 만든 지는 모르겠지만, 나도 모르게 그 틀 안에서 코드를 작성하고 있었고, 크루원들도 마찬가지였다. 그..
글을 쓰게 된 이유 레벨 2 장바구니 미션을 진행하면서 입력에 대한 유효성 검증을 할 때, 크루들마다 @Valid, @Validated 를 사용하고 있어서 둘은 어떤 차이가 있는지 학습해 보고자 글을 작성했습니다. dependency bean validation 을 사용하기 위해서는 아래와 같은 의존성을 추가해줘야 합니다. implementation 'org.springframework.boot:spring-boot-starter-validation' 왜 사용할까? 두 어노테이션 모두 유효성 검사를 편하게 하기 위해서 사용합니다. 다만 @Valid는 Java Bean 유효성 검사 사양의 일부로 javax 패키지에 존재합니다. @Validated는 스프링 자체에서 위 @Valid의 응용으로 스프링과 함께 ..
글을 쓰게 된 이유 JdbcTemplate을 사용하는 Dao 계층을 테스트하기 위해서 @JdbcTest 어노테이션을 사용하여 테스트를 작성했습니다. 이때 test 관련 yml 파일에서 DB url을 url: jdbc:h2:mem:testdb;MODE=MySQL 을 설정해 주었습니다. 하지만 schema.sql을 읽는 중에 H2 데이터베이스에 올바르지 않은 스키마라며 계속해서 테스트가 진행되지 않았습니다. 결론적으로는 제가 설정한 yml 파일을 읽지 않고, 다른 url을 가지고 있었습니다. 그러면 @JdbcTest를 사용하면 왜 제 yml을 읽지 않는 것이고, 설정된 yml 파일을 읽게 하려면 어떻게 해야 하는지 학습해 보았습니다. @JdbcTest 먼저 JdbcTest 어노테이션을 보니 많은 어노테이션들..
글을 쓰게 된 이유 '우아한 테크코스'(이하 우테코)에서 운이 좋게 '프롤로그' 운영 및 개발 근로를 맡게 됐습니다. 그래서 온보딩 과제 중 하나인 Flyway를 맡게 되었고, 크루원들에게 설명하고자 해당 글을 작성했습니다. Flyway란? DB의 버전 제어를 통해 쉽고 확실하게 DB migration을 도와주는 Tool입니다. 즉, DB의 형성관리 툴로 DB 버전의 Git이라고 생각하시면 됩니다. 스크립트를 통해 DB의 DDL 변경 이력을 쌓아서 DDL이 어떻게 변화되었는지 관리합니다. 굳이 DDL 변경 이력을 관리해야 하나요? 배포가 이미 완료된 복잡하고 많은 data가 있다고 가정해 보겠습니다. 개발 중 새로운 필드를 추가하게 되었다면 어떻게 처리할 수 있을까요? 1. 배포 서버 DB에 직접 들..
글을 쓰게 된 이유 DB 공부를 하던 중에 인덱스가 성능 이슈를 해결하는 방법 중 하나라고 알고 있었습니다. 하지만 실제로 인덱스를 써본 적이 없어서 실습을 하며 인덱스는 왜 사용하는지 알아보고자 이 글을 작성했습니다. 1편에서는 인덱스 정의 및 간단한 실습을 해보고, 2편에서는 인덱스의 종류, 실습을 통해서 좀 더 깊이 파보도록 하겠습니다. 인덱스는 무엇인가? index의 뜻은 색인이라는 뜻으로 책의 목차라고 생각해 주시면 됩니다. 목차를 보면 어떤 내용이 어떤 페이지에 있는지 바로 알 수 있기 때문에 우리는 굳이 책의 전체를 살펴보지 않아도 원하는 내용이 있는 페이지를 찾을 수 있습니다. 데이터베이스의 index도 책에서의 목차 와 같은 역할을 합니다. 데이터를 조회할 때 테이블의 모든 데이터를 살..
글을 쓰게 된 이유 지하철 미션 때 CRUD에 따른 상태 코드 및 반환 값을 다시 한번 생각해 보자라는 리뷰를 받았었습니다. 평소에 저는 POST 요청 시 id를 반환하고, DELETE나 PATCH/PUT 연산 시에는 반환 값이 없었습니다. 물론 상태 코드도 명시하지 않았고요. 상태 코드 반환은 좋다고 생각하지만, POST, PATCH/PUT 때 값을 반환하는 것은 좋지 않다고 생각했습니다. 왜냐하면 "각각 생성, 수정에 대한 책임을 가지는 것이지 조회까지 해줘야 하나?"라는 생각으로요. 하지만 우테코에 온 만큼 이러한 세세한 부분도 제대로 공부하고자 실제 기업에서는 API 스펙을 어떻게 정의했는지, RFC 문서에서는 어떻게 정의되어 있는지 HTTP 메서드마다 살펴보겠습니다. POST POST는 리소스를..
글을 쓰게 된 이유 스프링 미션을 하면서 HTTP GET 요청 시, 파라미터(쿼리 스트링)를 객체에 바인딩해주는 어노테이션이 어떤 어노테이션인지 알아보기 위해 글을 작성하게 됐습니다. ProductDao 에서는 @JdbcTest를, ProductQueryService , ProductCommandService 에서는 @SpringBootTest를 통해서 통합 테스트를 하고 있습니다. 먼저 코드를 보겠습니다. public class GameInfoRequest { @Size(min = 2) private String names; @Positive private int count; public GameInfoRequest() { } public String getNames() { return names; }..
글을 쓰게 된 이유 @ExceptionHandler, @RestControllerAdvice, @ControllerAdvice, @ResponseStatus를 사용하여 스프링에서 exception 처리하는 방법을 알게 됐습니다. 해당 어노테이션들이 어떻게 동작이 되는지, 처리되는지 알아보고자 디버깅을 해보았습니다. 어디에서 breakpoint? 공식문서에서 아래와 같이 DispatcherServlet 안에서 HandlerExceptionResolver 를 통해서 처리된다고 나와있기 때문에 breakpoint를 쉽게 찾을 수 있었습니다. Support for @ExceptionHandlermethods in Spring MVC is built on the DispatcherServlet level, Han..
3인 페어 이번 체스 미션에서는 3인 페어를 하게 됐습니다. 항상 3인 페어 얘기가 나올 때, "난 안 걸렸으면 좋겠다"라는 생각을 했습니다. 왜냐하면 의견이 많아지면서 더 힘들어질 것 같기 때문이었죠. 하지만 이번 미션은 저의 이러한 생각을 바꾸게 된 계기가 됐습니다. 3인 페어가 더 힘들지 않고 재밌습니다. 다양한 의견을 들을 수 있어서 재밌었고, 2명이 얘기할 때 쉴 수도 있습니다,, ㅋㅋㅋ 그리고 한 명 더 있기 때문에 아이디어가 +1 됨으로써 접근방법이 1개 늘어나게 됩니다. 운이 좋게도 이번에 같이 한 페어들이 모두 좋았습니다. 한 분은 항상 밝아서 긍정 에너지를 뿜었던 분이었고, 다른 한 분은 아이디어 뱅크였습니다. 그래서 그런지 이번 체스 1, 2단계 미션은 빠스 탔던 것 같기도 하고,,?..