모락 프로젝트를 진행하는 과정에서의 트러블 슈팅 내용을 다루고 있습니다. 오늘은 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에 의미를 부여해주면 좋겠다..
우아한테크코스 강의 중 네오께서 해주신 "상속", "클래스와 인스턴스(심화)" 강의 중 일부를 정리하면서 추가로 학습한 내용과 나의 소소한 생각을 작성하였다. "상속보다는 컴포지션을 사용하라", "상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라", "추상 클래스보다는 인터페이스를 우선하라" 등 이펙티브 자바 3/E에는 조슈아 블로크님의 상속에 대한 부정적인 의견들이 가득하다. 상속은 정말 나쁜가? 상속은 죄가 없다!! 내가 잘 못 사용하고 있을 뿐!! 상속은 코드를 재사용하는 강력한 수단이지만 항상 최선의 선택이 되는 것은 아니다. 상속은 여러가지 단점을 가지지만, 근본적인 원인은 상속 그 자체가 아니라 상속을 잘 못 사용하고 있는 우리들이다. 상속을 잘 못 사용할 경우 큰 부작용이 ..