본문 바로가기

전체279

Java LocalDateTime.toString()은 JavaScript에서 어떻게 호환될까? 폴리글랏으로 프로그래밍하며, 여러 언어로된 도메인끼리 메세지를 보내다보니 파일 포맷에 대한 이슈가 있었다. LocalDateTime.now() 를 외부에 전송하게 되면 "2021-11-02T00:05:03.128" 이런식의 String 으로 발송된다. Javascript 에서 이를 호환된 포맷으로 전송하기 위해서는 moment 를 사용할 경우에는 아래와 같은 포맷으로 작성하면 된다. moment.tz('Asia/Seoul').format('YYYY-MM-DD[T]HH:mm:ss.SSS') 참고자료 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#patterns DateTimeFormatter (Java Pl.. 2021. 11. 2.
여기가 한국이지 미국이 아님 - [절대 성공하지 못할 거야] 북 리뷰 '리드가 영화 [아폴로 13] 비디오를 늦게 반납하는 바람에 비디오 대여업체 블록버스터에 연체료 40달러를 냈고, 그리고 랜돌프와 리드가 넷플릭스의 사업을 구상해냈다.' 약 한달간 이 책을 읽으며 넷플릭스가 창업하고, 기업공개까지 하는 과정을 살펴볼 수 있었다. 그 과정에 대해서 책을 덮고 생각해보니- 넷플릭스라는 회사는 전세계에서 가장 유명한 실리콘밸리라 하는 곳에 위치해있다, 그럼에도 불구하고 부딪히는 일련의 장애물은 우리나라에 존재하는 어느 스타트업과 크게 다르지 않다는 생각이 들었다. 우리나라의 스타트업도 자금문제와 인력문제로 어려운 나날을 보내는 곳이 많다. 똑같이 넷플릭스도 그런 문제를 겪었다는 사실에 '여기가 미국인가, 한국인가' 라는 생각이 들기도 했다. 특히 빌 클린턴 대통령의 섹스 스캔.. 2021. 11. 1.
#1 스터디 할래 - 1주차 1. JVM이란 무엇인가? JVM 은 Java Virtual Machine 의 약자로서, Java 가 동작될 때 동작될 수 있는 플랫폼을 제공해준다. 이는 즉 다시 말하면 Java로 개발한 프로그램을 컴파일하여 만들어지는 바이트코드를 실행시킬 수 있는 가상머신이다. JVM 의 가장 큰 특징으로는 Write one, Run anywhere 라는 모토이다. 이는 어떤 OS의 제약에도 해당되지 않는 것과 같다. JVM의 컴파일러가 .java 소스파일을 컴파일하면 .class 클래스 파일을 JVM에게 건네주게 되면 JVM이 클래스파일을 메모리에 로드하여 실행할 수 있다. 여기서 컴파일러는 프론트엔드에 속하고, JVM은 백엔드에 속한다. 이말은 위에서 말한것과같이 .java 를 Compiler 를 통해 Compi.. 2021. 10. 30.
한번에 단계를 뛰어넘어 버리는 비약적인 코드를 피하자. SqsNameMapping 를 구현하는 과정에서 비악이 일어나는 코드를 작성하게 되었습니다. 비약이란? 비약은 논리나 사고방식이 '중간과정을 건너 뛰었다'는 뜻으로, 상대방의 논지전개에 있어 허구성을 지적하거나, 실현가능성이 희박한 내용을 과장하는것을 지적하는 말 입니다. 아래 코드는 2단계를 뛰어 넘어서는 비약된 코드이다. @Component @ConfigurationProperties(prefix = "aws.xxx") public class XxxNameMapping implements Mapping { private Map queue; @Override public String get(String type) { return queue.get(type); } } 왜일까? 1단계 XxxNameMapp.. 2021. 10. 29.
메세지와 이벤트의 차이점은 무엇인가? 들어가기 트레바리에서는 도메인주도설계를 실천하고 있습니다. 도메인주도설계라는 것은 말 그대로 도메인을 중심으로 복수의 도메인이 책임,역할, 협력을 할 수 있도록 개발하는 것을 말합니다. 실제로 동작되는 코드로서 도메인주도설계를 실천하며 우리는 메세지와 이벤트라는 용어를 자주사용했습니다. 이미 횟수로 귀로 많이 들어왔지만- 깊이있는 고찰을 하지 못했습니다. 헷갈릴 수 있는 두 용어에 대한 이해를 정리해보려 합니다. 본문 도메인주도설계는 잠시 잊어버리고 메세지란 무엇일까? 흔히 우리는 '메세지를 전달한다' 라고 말합니다. 이 말은 즉슨, A → B 에게 의미있는 내용을 전달하기 위한 행위라 볼 수 있습니다. 그럼 도메인주도설계에서는 어떤 의미를 가질까요? 여기서 USER, MEMBER 는 AGGREGATES.. 2021. 10. 23.
MAC OS 에서 Icon 이 Bouncing 하지 않도록 하는 방법 https://howchoo.com/mac/disable-mac-icon-bounce 2021. 9. 26.
용병팀과 미션팀 - [인스파이어드] 책을 읽고 이직간에 약 2주간에 휴가중에 마티케이건의책 '인스파이어드' 라는 책을 읽었다. 사실 이 책은 이전회사 재직 중에 읽어보려고 했던 책 중에 하나였으나, 그 당시 '인스파이어드' 책을 약 50페이지 정도 읽을 적에 나에게 맞지 않는 책이라 판단하고- 책을 알라딘에 팔아버렸다. 그럼에도 불구하고 다시, 이 책을 편 이유는 최근 끊임없이 고민하고 있는 부분에 대한 해답을 알려줄거라는 믿음 때문이였다. 과거에는 인스파이어드 책이 맞지 않았다. 왜 이전직장에서는 이 책을 읽으려고 했을 때 맞지 않았다라고 생각했을까? '인스파이어드' 책에서는 프로덕트(Product) 라는 부분에 초점을 맞춘다. '우리가 프로덕트를 만드는 건 엔지니어, 디자이너를 포함해 많은 이해관계자가 서로 협업을 통해 하나가 되어 집중해야되고 .. 2021. 9. 13.
Thymeleaf CheatSheet - 2 (template layout) 공통된 영역은 따로 분리해서 개발해야 한다. 그런 부분에 대한 처리가 바로 템플릿 레이아웃이다. 3가지 방식이 있다. 1. 템플릿 조각 th:fragment 태그의 의미는 다른 곳에 포함되는 코드 조각이라 이해하면 된다. 어떻게 사용하는가? // footer.html 푸터 자리 입니다. 파라미터 자리 입니다. footer.html 에서 2개의 fragment 를 copy 와copyParam 선언했습니다. 그럼 선언한 fragment 를 사용한 부분은 다음과 같습니다. 부분 포함 부분 포함 insert 부분 포함 replace 부분 포함 단순 표현식 파라미터 사용 ~{...} 를 사용 와 같이 footer :: copy 사용 insert 와 replace 의 차이는 현재 태그가 어떻게 되는지에 대한 차이 .. 2021. 9. 6.
Thymeleaf CheatSheet - 1 (basic) Thymeleaf CheatSheet - 1 (basic) 1. 텍스트 - text, utext text vs utext th:text = th:utext = [[...]] vs [(...)] [[...]] = [[${data}]] [(...)] = [(${data})] = ${users[0]['username']} = ${users[0].getUsername()} = Map ${userMap['userA'].username} = ${userMap['userA']['username']} = ${userMap['userA'].getUsername()} = map 으로 선언된 객체일 경우 인텔리제이에서 인식하지 못하는 경우도 있는것 같다.. 2021. 9. 6.
소프트웨어 아키텍처? 그거... 먹는건가? 마틴 파울러의 소프트웨어 아키텍처의 중요성이라는 동영상을 약 3번이상 반복해 재생했습니다. 소프트웨어 아키텍처는 무엇일까? 여전히 풀리지 않지만- 마틴파울러의 동영상을 계속해서 살펴보면서 느꼈던 저의 생각을 적어볼까 합니다. 내가 알고 있는 소프트웨어 아키텍처는 무엇이였을까? 짫게 이야기해보면 '내가 속해있는 팀의 리더가 어떤 도구를 사용할 것인지 결정해 팀원들에게 알려주면 팀원들은 리더가 정해준 도구를 활용해 아키텍처를 설계한다.' 라고 정의할 수 있지 않을까요? 조금 더 이야기해보면 미리 모든 설계가 되어 있거나, 어떤 개발 도구를 선택해야 될 때 내가 아닌 누군가에 의해 결정되어져 나에게 오는 것이라는 생각이 강했습니다. 반대로 팀장의 입장에서 생각해봐도 팀원들과 논의하기 보단, 독단적으로 결정하고.. 2021. 9. 2.
SpringMVC 에서 말하는 MessageConverter 코드로 이해하기 SpringMVC는 어떻게 내가 보낸 요청 메세지를 찰떡같이 알아듣고 Json 등의 내가 원하는 값으로 반환해주는걸까? HTTP 메시지 컨버터에 대해서 조금더 자세히 알아보려고 합니다. 총 2가지로 나눠서 살펴볼 예정입니다. POST 방식의 Request 보낼시, @RequestBody 가 어떻게 Converter 되는지. GET 방식으로 Request 조회시, @ResponseBody가 어떻게 Converter 되는지 확인해볼 예정입니다. MessageConverter 종류 MessageConverter 의 종류를 이해하기 위해서는 먼저 HttpMessageConverter 가 무엇인지 알아봅니다. SpringMVC 에서는 인터페이스로 존재하는데, 아래와 같습니다. package org.springfr.. 2021. 8. 15.
DB 트랜잭션 조금 이해하기 - 최범균 유튜브 리뷰 최범균님 강의로 DB 트랜잭션 조-쪼금 이해하기 1,2 https://youtu.be/poyjLx-LOEU 개발자 관점에서 트랜잭션은 간단하게 여러 읽기/쓰기 를 논리적으로 하나로 묶음 트랜잭션 시작 - 여러 쿼리 실행 - 커밋 또는 롤백 모두 반영(커밋) 또는 모두 반영하지 않거나(롤백) 이런 트랜잭션이 없다면? 1.3 에서 실패할 경우, 1.2 업데이트을 취소할 수 있는 것을 구현해야 한다. 트랜잭션 범위는 커넥션 기준으로 합니다. 만약 5 에서 롤백될 경우, 4,3 의 롤백 되고, 그 뿐만 아니라 4.1 에서 롤백도 기대하게 됩니다. 그러나, 4.1 처럼 새로운 트랜잭션을 만들었다면 4.3 에서 이미 commit 되었기 때문에 롤백되지 않습니다. 여러 메소드를 호출할 때 하나의 트랜잭션으로 묶고 싶.. 2021. 8. 1.
Layered Architecture 의 단점이 무엇이라고 생각하는가? 들어가기 이전 포스팅의 내용이였던 DDD-Lite 동영상 시청 리뷰 의 내용을 정리하다가 문득 궁금증이 생겼습니다. 정명주 강사님께서 `Layered Architecture 의 단점으로 인해, Hexagonal(Onion) Architecture 가 나왔다.` 그럼 어떤 단점이냐? 바로 ~ 계층형 아키텍쳐의 단점은 무엇이냐면? 결국에는 도메인이 인프라에 의존하게 됩니다. 이 말은 즉, 도메인 관심사와 기술적 관심사가 섞이게 된다는 것을 의미합니다. 라고 동영상 중간에 말했습니다. 여기서 저는 왜? 도데체 왜 섞이지? 라는 생각을 하게 되었습니다. LayeredArchitecture 가 무엇인가? 우리가 흔히 알고 있는 LayeredArchitecture 는 여러 군데에서 사실 발견할 수 있습니다. 제가 .. 2021. 7. 26.
직접 코딩으로 느껴본 Spring Data JPA와 Spring Data JDBC 의 차이점 기존의 트랜잭션 스크립트 패턴으로 구현된 코드를 JPA로 변경해보면서 의존성을 분리하고, 다시한번 트랜잭션 스크립트 패턴으로 구현된 코드를 Spring Data JDBC (Spring JDBC와는 다른 Spring Data 에서 제공하는 라이브러리입니다.) 로 변경하면서 느꼈던 차이점에 대해서 작성할 예정입니다. Github - https://github.com/LenKIM/jwp-refactoring 트랜잭션 스크립트로 작성된 코드의 브랜치 - step1 JPA로 구현된 코드의 브랜치 - step3 Spring Data JDBC 로 구현된 코드의 브랜치 - try-spring-jdbc-step2-service Index Referance 에서 말하는 Spring Data JDBC와, JPA의 차이점 내.. 2021. 7. 18.
[2019] DDD Lite@Spring 동영상 시청 리뷰 DDD-Lite@Spring 세미나 내용이 유익하다고 판단되, 동영상을 보면서 정리한 내용입니다. 2번째 시청하면서, 정명주님이 생각하는 DDD에 대한 개념이 잘 녹아있고, 간결하게 DDD 에 대해서 설명해주셔서 정리하고자 합니다. 유지보수 사항에서 항상 개발자는 고통받습니다. 왜 그럴까요? 왜냐하면서, 애플리케이션이 엄청 복잡하기 때문입니다. 크게 2가지로 복잡합을 구분해보면 우리가 해결해야 할 문제 자체 우리가 사용하는 기술과 도구 위기가 어떻게 오는가? 빠르고 간단하게 일정 드리븐 개발을 하다보니까- 빠르고 간단하게 개발했는데, 요구사항이 변경되고 점점 복잡해지면서 빅뱅식 개편을 많이 하는데, 잘못된 레거시에 의존하기 때문에 이 순환이 반복됩니다. 원인은 빠르고 간단하게 맞지않는 접근법을 이용하다보.. 2021. 7. 18.
[우아한테크코스Pro] 서비스 진단하기 - 1 (Logging) [6/9] [목표] Spring 의 로깅을 남길 수 있다. 웹 성능을 테스트 할 수 있다. 스프링 프레임워크에서는 LogBack을 활용해서 로그를 남길 수 있다. 공식 사이트 Spring boot 는 Commons Logging(org.apache.commons.logging) 를 사용하는데, 기본 설정자로서, Log4J2, Java Util Logging, 그리고 오늘 우리가 알아볼 LogBack 을 사용합니다. Logging 의 Level 은 총 크게 4단계로 나눠집니다. ERROR - 예상하지 못한 심각한 문제가 발생하여 즉시 조사해야 함. WARN - 로직상 유효성 확인, 예상 가능한 문제로 인한 예외처리 등을 남김, 서비스는 운영될 수 있지만, 주의해야 함. INFO - 운영에 참고할만한 사항으로, 중요한.. 2021. 7. 16.
State Pattern 이해하기 아래 내용은 클린 소프트웨어의 일부 내용을 재편집한 내용입니다. 스테이트 패턴 왜 이 패턴을 쓸까? 스테이트 패턴을 이해하기 위해서는 유한 상태 기계(FSM: finite state machine) 를 먼저 이해해보자. 이 다이어그램을 상태 전이 다이어그램(STD: state transition diagram) 이라 한다. 모서리가 둥근 상자는 상태(state) . 상태를 연결하는 화살표는 전이(transtion). 전이에는 이벤트(event) 의 이름과 그 이벤트에 따르는 행동(action) 이 이름표가 붙는다. 만약 기게가 Locked 상태가 있는데 coin 이벤트를 받는다면, unlocked 상태로 전이하고 unlock 행동을 호출 만약 기계가 Unlocked 상태에 있는데 pass 이벤트를 받는다.. 2021. 7. 14.
[우아한테크코스Pro] 인수 테스트 기반 TDD - 2 [5/9] [목표] 인수테스트 기반 TDD을 도와주는 RestAssured 를 이해할 수 있다. 언제 인수테스트 기반 TDD 를 사용하는 것이 적절한지, 이해할 수 있다. 왜 인수테스트 기반 TDD를 사용하는 것이 적절한지 이해할 수 있다. 어떻게 인수테스트 기반 TDD를 사용하는 것이 적절한지 이해할 수 있다. 인수테스트 기반 TDD을 도와주는 RestAssured 를 이해할 수 있다. RestAssured 의 공식사이트 RestAssured 는 REST service 를 테스트할 때 도움을 주는 테스트 도구 이다. 우리가 흔히 사용하는 GET, POST, PUT, DELETE 메소드를 지원한다. 만약, GET lotte/5 을 했을 경우 아래와 같은 경우가 나온다면? 아래 내용은 RestAssured 공식 사이.. 2021. 7. 14.
성능테스트 k6 결과 내역을 이해해보자. 공식 사이트 중에서도 k6 의 결과를 설명해주는 페이지 를 보고 이해하고자 했습니다. data_received..............: 148 MB 2.5 MB/s data_sent..................: 1.0 MB 17 kB/s http_req_blocked...........: avg=1.92ms min=1µs med=5µs max=288.73ms p(90)=11µs p(95)=17µs http_req_connecting........: avg=1.01ms min=0s med=0s max=166.44ms p(90)=0s p(95)=0s http_req_duration..........: avg=143.14ms min=112.87ms med=136.03ms max=1.18s p(90)=1.. 2021. 7. 9.
docker 에 올라온 postgres 에 접속해, Database 확인하는 방법 InteliiJ 의 편리함에 속아, 실제 DB 작업할 때는 어버버한 저를 위해 남깁니다. 먼저, 작성하기 전에 데이터베이스의 목적은 영속성입니다. 그러나 Docker는 쉽게 지우고 설치할 수 있습니다. DB의 영속성과 Docker? 사실 말이 안맞긴 합니다만... 😳 우리는 개발환경을 빨리 세팅하고 싶으니까...ㅎㅎ 참조문서 - https://hub.docker.com/_/postgres 아래 명령어를 실행했다고 가정하겠습니다. docker run --rm --name mypg -d \ -v ${PWD}/app/src/main/resources:/docker-entrypoint-initdb.d \ -p 5432:5432 \ -e POSTGRES_PASSWORD="password" \ -e POSTGRES.. 2021. 7. 9.