본문 바로가기

지금 당장 좋은 커밋 메시지를 남기는 방법(with Git Commit Template) clean code? clean commit! 좋은 코드를 작성하는 것은 엄청 중요하고, 꾸준히 반복하고 또 연습해도 상당히 어려운 일이다. 갑자기 좋은 코드를 작성하는 것에 대해서 왜 얘기하냐고 할 수 있는데, 그 이유는 좋은 코드를 남기는 것 만큼 중요한 게 "좋은 커밋 메세지(Commit Message)를 남기는 것"이라고 말하고 싶기 때문이다. (그런데 사람들은 이것을 간과한다...) 물론 어떤 것이 좋은 코드인가? 라는 질문에도 여러 답변이 있다. 결합도는 낮고 응집도는 높은 객체지향적인 코드 짧고 간결한 코드 가독성이 좋은 코드 더 이상 고칠게 없는 코드 중복이 없는 코드 테스트가 많은 코드 기타 등등... 이와 유사하게 어떤 것이 좋은 커밋 메시지인가? 라는 질문에도 여러 답변이 있다. 먼 ..
스프링 부트 애플리케이션에서 초기화 코드를 넣는 3가지 방법 (by 토비님) 스프링 부트에서 초기화 코드를 넣는 3가지 방법 이 포스트는 토비님의 유튜브 강의를 보고 내용을 정리한 포스트입니다. (출처 : https://www.youtube.com/watch?v=f017PD5BIEc) 위의 영상을 보면서 같이 공부하기 어려운 경우(시간이 없거나 집중하기 어려운 경우..?)에 제 글을 가볍게 참고하시면 좋을 것 같습니다. 배경 스프링부트 애플리케이션이 시작할 때 백그라운드에서 굉장히 많은 스프링 빈(Bean)들이 만들어지고 그 외에 스프링 컨테이너가 초기화하는 과정이 진행된다. 여기서 하고자 하는 것은 앞서 언급한 모든 작업을 마치고 나서 "초기화 코드"를 넣어야 하는 경우에 어떤 방법이 있을까에 대한 것이다. 내가 만든 스프링 부트 애플리케이션이 정상적으로 실행이 완료되면, 모니..
로그인 과정으로 살펴보는 스프링 시큐리티 아키텍처(Spring Security Architecture) Spring Security Architecture 학습 목표 스프링 시큐리티를 처음 배우는 사람 또는 적어도 한 번은 적용해본 사람을 기준으로 "가장 기본이자 뼈대인 구조를 이해한다"는 학습 목표가 있다. 수 많은 블로그를 참고하면서 이해가 가지 않던 부분을 필자가 학습해 본 방법(로그인 동작으로 살펴보는 방법)으로 구조와 개념을 확립하고자 한다. 용어 정리 스프링 시큐리티에서는 "인증"과 "권한"을 분리하여 체크할 수 있도록 구조를 만들었다. Authentication(인증) : 'A'라고 주장하는 주체(user, subject, principal)가 'A'가 맞는지 확인하는 것 코드에서 Authentication : 인증 과정에 사용되는 핵심 객체 ID/PASSWORD, JWT, OAuth 등 여러..
Controller 1개가 어떻게 수 많은 Request를 처리하는가? (spring mvc, tomcat thread, singleton bean) Controller 1개가 어떻게 수 많은 Request를 처리하는가 배경 의식의 흐름 Controller는 한 개인가? 지금와서 생각하면 조금 바보같았지만, 저런 질문이 떠오른 이유는 아래와 같습니다. 스프링에서 웹 애플리케이션을 개발할 때, (대부분의 경우에) 스프링 빈(Bean)으로 객체를 생성합니다. Bean의 스코프를 prototype으로 변경하면 HTTP Request 마다 해당 빈을 새롭게 생성해서 처리하도록 할 수 있지만, 그렇게 하는 경우를 거의 본 적이 없습니다. 그러면 내가 만든 Controller(Bean) 하나가 1만 개의 요청이든 10만 개의 요청이든 처리를 한다는 얘긴데, 이게 감당가능한가? 이런 생각이 갑자기 스쳐지나가면서 의문이 생겼습니다. 조금 찾아보니 결론은 Contro..
스프링 부트에서 Request 유효성 검사하는 방법, 서버 개발한다면 꼭 해야하는 작업 Spring Validation 스프링부트에서 Request로 오는 객체(DTO)를 어떻게 검증하는가에 대한 이야기 데이터 검증(validation)은 여러 계층에 걸쳐서 발생하는 흔한 작업이다. 어떻게하면 깔끔하게 유효성 검사를 할 수 있을지 생각해보고 얻은 방법을 공유하고자 한다. 스프링에서 가장 기본적인 validation은 Bean validation이다. Bean validation Bean validation은 클래스 "필드"에 특정 annotation을 적용하여 필드가 갖는 제약 조건을 정의하는 구조로 이루어진 검사다. validator가 그 클래스로 생성된 객체의 유효성 여부를 확인한다. 어떠한 비즈니스적 로직에 대한 검증이 아닌, 객체 자체의 필드에 대한 검증을 한다. 예제 코드를 보고 테스트해본다. plugins { ..
Jackson custom serializer, deserializer 적용했던 사례 공유, LocalDateTime JSON 파싱하는 방법 Jackson custom serializer, deserializer example JSON은 프로그래밍에서 굉장히 많이 쓰이는 데이터 포맷이다. 특히 스프링부트를 이용한 프로젝트에서는 'spring-boot-starter-web'을 dependency에 추가하기만 하면 jackson이라는 json 라이브러리가 자동으로 추가될 정도다. 심지어 jackson이 제공해주는 objectMapper 객체는 스프링 빈으로 제공하기까지 한다. 그러나 이렇게 기본 제공해주는 objectMapper 객체의 경우, 그냥 사용하기에는 모든 요구사항을 충족하기 어렵다. 요구 사항을 충족시키시 위해서는 Object to JSON(Serialize/직렬화), JSON to Object(Deserialize/역직렬화)를 입맛에..
윈도우에서 NTP Server 구축, NTP Client 설정하는 방법, 배치 파일 스크립트 작성하기 (폐쇄망에서 시간 동기화하는 요구사항 처리하기) 폐쇄망에서 시간 동기화가 하고싶다 이 포스트를 쓰게 된 배경에는 폐쇄망에 존재하는 PC들 사이에 시간을 동기화 하고 싶은 요구가 있었다. 스마트 팩토리를 지향하는 제조사에서 생산 장비에서 발생하는 데이터를 수집, 분석하는 요구가 많다. 이 데이터들을 수집, 분석하는데에 주요한 요소 중 하나가 데이터를 얻은 시간인데 이 장비들은 또 각각의 시스템 시간을 갖고 있어서 동기화를 해야하는 필요가 있다. 그러나 데이터 유출로 인한 피해가 예상되어 삼엄한 보안 관리(폐쇄망, 하드웨어/저장장치 등 반출 안됨, ...)를 적용하는게 대부분이라 인터넷에 있는 시간으로 동기화할 수 없는 문제가 있다. 이럴 때 시간 동기화 처리를 위한 방법으로 NTP서버를 만드는 것이 있다. NTP란? Network Time Protoco..
REST API 응답은 어떻게 줘야할까? (표준 Response 객체를 만들 수 있을까?, 정확하게 응답 처리를 하는 방법, 성공과 실패 응답) - 왜 이런 생각을 하였는가? 필자가 쓰는 Vue 프레임워크에서 axios라는 HTTP client 라이브러리가 있다. 해당 라이브러리에서 HTTP 요청에 성공했을 때는 왜 "response.data"에 http reponse의 body 값이 들어가고, HTTP 요청에 실패했을 때는 왜 "error.response"에 body내용이 들어가는지가 궁금했다. HTTP 요청에 성공했든 실패했든 모든 응답은 response라고 하고 body 내용이면 "repsonse.body"로 통일하면 되는거 아닌가? 하는 생각이 들었다. //success { "payload" : "~~~~", "error" : null } //fail { "payload" : null, "error" : { "message" : "Not ..