두서없이 쓰는 그냥 일기입니다🤔 (잠깐 홍보) 모락이 어떤 프로젝트인지 궁금하다면? 👉 모락 데모 페이지로 이동 최종 데모 데이 이틀 전 금요일 우아한테크코스 4기 최종 데모데이를 진행했다. 팀원들과 함께 약 4개월간 진행했던 프로젝트를 우테코 외부 사람들에게도 공개하는 것이기 때문에 설레면서도 불안했다. '우리 프로젝트를 사람들이 보러 올까?', '사람들이 어떤 반응을 보일까?' 사실 설렘보다는 불안한 마음이 더 컸던 것 같다😚 처음에는 구경오시는 분들이 별로 없어서.. 우리 프로젝트에 다들 관심이 없나.. 하는 속상한 마음도 들었다. 그래도 후반부에는 꽤 많은 분들이 오셔서 오히려 정신없이 지나간 것 같기도 하다. 실제 현업에서 일하고 계신 개발자분들이나 코치님들, 이전 기수 분들이 오셔서 프로젝트에..
모락 프로젝트를 진행하는 과정에서의 트러블 슈팅 내용을 다루고 있습니다. 오늘은 byte[]를 String으로 변환하는 방법에 대해 이야기해보려 합니다. 먼저 QA 과정에서 발견된 문제 상황에 대해 공유해드리려고해요. 저희는 로직 상 처리하지 못한 예외에 대해서는 문제 상황을 재현해 볼 수 있도록 요청 정보를 모두 로깅하고 있었습니다. 그런데 로그 파일을 까고 보니 요청 바디(Request Body)가 다음과 같이 이상한 숫자들로 출력되고 있었습니다. 분명 PR을 날리기 전에 요청 바디가 잘 찍히는 것을 확인했었는데.. 이상한 일이었습니다🥲 이와 관련해 왜 이러한 문제가 발생했는지, 어떻게 해결했는지 이야기해보겠습니다. new String()을 사용했던 이유 private static StringBuil..
모락 프로젝트를 진행하는 과정에서의 트러블 슈팅 내용을 다루고 있습니다. 오늘은 EC2 인스턴스에서 Swap Memory를 설정하는 방법에 대해 이야기해보려 합니다. 모락팀에서는 정적 분석 도구로 SonarQube를 사용합니다. SonarQube를 사용하기 위해서는 이를 위한 서버를 하나 띄워야합니다. 24시간 정적 분석이 가능하게 하려면 24시간 가동 중인 컴퓨터에 해당 서버를 띄워야겠죠? 그래서 저희는 SonarQube 용 EC2 인스턴스를 새로 띄우기로 결정했습니다. 그런데 이 과정에서 문제가 발생했습니다. SonarQube 설치까지는 정상적으로 완료했는데.. 서버가 띄워지지 않았습니다. 뭐가 문제일까? 고민을 하다 SonarQube 서버를 띄우기 위한 최소 메모리 요구사항이 있었던 것 같아 메모리..
스프링에 대해 학습하다보니 내가 "웹 체스 미션"에서 사용하고 있는 스프링 부트는 그냥 스프링과 어떻게 다른 것인지 궁금해졌다. 최범균님의 "초보 웹 개발자를 위한 스프링5 프로그래밍 입문"과 스프링 부트 공식 문서로 학습한 내용을 짧게 정리했다. 스프링 부트에 대해 깊게 학습했다기보다는 "스프링 부트의 @SpringBootApplication 어노테이션이 이런 기능을 해주는거구나~" 정도로 학습한 내용을 정리한 것으로 앞으로 추가적으로 학습해야하는 부분들이 참 많아 보인다..😅 스프링 부트는 최소한의 작업으로 스프링 프로젝트를 시작할 수 있도록 돕는다. @SpringBootApplication 어노테이션을 사용해 이러한 스프링 부트의 핵심 기능을 사용할 수 있다. @SpringBootApplicatio..
SQL 스터디에 참여하고 있는데, "총매출이 2번째로 높은 공급자의 id, 이름, 총매출을 조회해 주세요."의 쿼리문을 작성해야했다. 나는 이 문제를 "총매출이 큰 순서로 정렬하고 2번째 행을 검색한다."는 관점으로 접근했다. 이는 SELECT 문의 LIMIT 절을 이용해 구현할 수 있었다. MySQL 8.0 Documentations 으로 학습한 내용을 정리했다. Spring을 학습하는 과정에서 공식 문서를 좀 읽다보니 점점 다른 공식 문서도 좀 읽어보게 되는 것 같다😊 LIMIT The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric..
체스미션에서 View(Client)에 원하는 에러 메시지를 전송하기위해 아래와 같이 try-catch문을 남발하여 에러가 발생하는 경우 에러 메시지를 DTO에 담아 보내도록 구현했었다. 알고보니 Spark Java에서는 예외를 처리해주는 exception 메서드를 지원하고 있었고, 이를 사용하는 방향으로 리팩토링을 진행했다. Controller 에러가 발생하면 ErrorResponseDto에 에러 메시지를 담아 보내도록 구현하였다. 현재 모든 에러를 잡도록(일명 포켓몬 캐치..) 구현하였는데 이는 추후 수정이 필요해보인다. exception(Exception.class, (e, req, res) -> { res.body(GSON.toJson(new ErrorResponseDto(e.getMessage()..
DAO, DTO, Service, Controller의 개념을 잘 학습하지 않은 상태에서 "체스 미션 5단계 : DB 적용"을 구현하다보니 코드가 이상해지고 있다는 느낌을 받았다. 오늘은 이 객체들에 대해 알아보고 현재 내 코드를 어떻게 수정할 수 있을지 고민해보려한다. 이후 어떻게 변경되었는지도 추가하면 좋을지도..? DAO(Data Access Object) DB에 접근해 데이터를 조회하거나 조작하는 객체를 말한다. ellie's code 현재 에러처리에 소홀히 한 부분이 있다. (단순히 제이슨이 강의해주신 부분을 따라함..ㅎ) 이를 좀 더 유의미한 에러처리로 변경해야겠다!! 그리고 현재 PreparedStatement는 try-resources문을 사용해 자원을 회수하고 있지만 Connection에..
우아한테크코스의 체스 미션에서는 SparkJava를 활용해 웹 UI를 적용해야한다. 이를 위한 캡틴 포비의 강의가 제공되며, 해당 강의를 들으며 학습한 내용을 정리했다. 프로젝트 생성 및 세팅 클라이언트 요청 처리 : GET & POST Template Engine : Handlebars Java Bean을 이용한 데이터 전송 프로젝트 생성 IntelliJ에서 SpringBoot 프로젝트 생성 기능을 이용해 일단 프로젝트를 생성한다. build.gradle에서 SpringBoot와 관련된 설정들을 제거하고, main, test 디렉토리의 초기 파일들을 모두 제거한다. plugins { id 'java' } group = 'com.example' version = '0.0.1-SNAPSHOT' source..
11장. 동시성 이번 장에서는 동시성 프로그램을 명확하고 정확하게 만들 수 있는 방법을 제시한다. 동기화(Synchronized)란 무엇인가? 동기화에 대한 흔한 오해 동기화 적용 방법 volatile 키워드 Java.util.concurrent.atomic 패키지 1. 동기화(Synchronized)란 무엇인가? 멀티 스레드 환경에서 하나의 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장하는 것을 의미한다. 자바에서는 synchronized 키워드를 이용해 동기화를 제공한다. public synchronized void increase() { } synchronized(number) { } 동기화의 주요 기능 배타적 실행 한 스레드가 변경하는 중이라서 상태가 일관되지 않은 순간의 객체를 다른 스레드..
솔직히 아직 모든 내용을 이해한 것은 아니다. 하지만 일단 내가 이해한 부분까지 정리를 하고 추후에 더 추가 학습을 하는것이 좋을 것 같아 이렇게 글로 작성하게 됐다. 😄 문제 발생 public enum Result { WIN("승", (dealerScore, participantScore) -> (dealerScore participantScore && dealerScore 21); } 이 코드를 보시고 리뷰어 토니께서 21에 의미를 부여해주면 좋겠다..