본문 바로가기

전체 글45

jackson for kotlin part1. 동작 원리 kotlin 을 사용하면, kotlin 용의 jackson library를 설치해야한다.implementation("com.fasterxml.jackson.module:jackson-module-kotlin")spring initializer 로 스프링 프로젝트를 구성하다보면, 자동으로 해당 라이브러리가 설치되어있기 때문에 별 생각없이 쓰게 된다.개인적으로 토이 프로젝트를 하던 도중, 해당 라이브러리가 설치가 안되어있어서 json 변환관련 에러가 나서 도대체 이것이 뭔지 찾아보게 되었다.왜 jackson-module-kotlin 없이는 변환이 안될까?기본적으로 jackson 자체는 코틀린을 위한 라이브러리가 아니다.코틀린의 data class 와 같은 것들은 기본 jackson library 가 이해하지.. 2023. 12. 30.
@RequestBody, @ResponseBody 의 동작 원리 HandlerMethodArgumentResolver 와 HandlerMethodReturnValueHandler의 동작에 대해서 알아야하는데, 이를 알아보기전에 스프링 부트에서 http 요청이 어떻게 처리되는지 우선 알아야한다.dispatcher servlethttp 요청이 들어오면 dipatcher servlet의 doDispatch 메서드를 거치게 된다.doDispatch 메서드를 간소화하자면,getHandler 를 통해서, 요청을 처리할 수 있는 Handler 를 찾는다.handler 를 처리할 수 있는 handlerAdapter 를 찾는다.handlerAdapter를 통해서 실제 handler 를 호출한다.protected void doDispatch(HttpServletRequest reque.. 2023. 10. 21.
companion object 는 클래스이자 객체다. companion object 는 클래스이자 객체이다. 코틀린에서 object 키워드는 클래스 선언이자 동시에 객체 초기화를 동시에 하도록 동작한다. object expression 으로 동작하는 경우 무명 클래스를 선언하고 객체화하는 것과 같고, companion object 처럼 declration 으로 동작하는 경우에도 마찬가지이다. 이를 확인해보기 위해 아래와 같이 선언해보자. class NamedCompanion { companion object Foo { } } 그리고 간단하게 이를 확인하기 위해, 아래 테스트를 만들어보면 동작함을 알 수 있다. 만약, companion object가 아닌 일반 클래스를 아래와 같은 방식으로 작성하게 되면, 동작하지 않는다. foo 는 객체로 취급되지만, Na.. 2023. 10. 9.
설계 원칙 소프트웨어 아키텍처의 목표는 무엇인가? 생산성을 극대화하기 위함이다. 그렇다면 생산성을 극대화 한다는 것은 무엇을 의미하는가? 변경에 유연하고, 기능을 확장할 수 있어야한다. 그렇다면 어떤 코드가 변경에 유연해야하고, 어떤 코드가 확장되어야할 코드일까? 그러니까 어떤 영역을 우리는 지켜야 할까? 바로 우리의 도메인 영역이다. 도메인 영역을 잘 지키기 위해서는 어떻게 해야할까? OCP OCP 는 이런 관점에서 중요한 설계 원칙이다. 기존 코드의 변경없이, 기능을 확장할 수 있어야한다. 그렇다면 이것은 어떻게 가능할까? OCP는 단순히 다형성만으로 설명할 수 있는 개념은 아니다. 아키텍처 관점으로 볼때, OCP가 잘 이루어지기 위해서는, 컴포넌트와 모듈은 응집력있고, 컴포넌트와 모듈의 결합은 낮아야한다. 이.. 2023. 9. 3.
REST에서 resource와 representation은 다르다. (feat 삽질기) 1. resource? representation? 의 개념 resource는 data의 추상화를 말하는 것으로 representation과는 구별됩니다. 특정 시점에 resource의 state (상태)를 representation이라고 합니다. selected representation이란 말은 결국, resource의 상태는 하나가 아닌 여러개가 될 수 있고 HTTP 통신에 의해서 resource의 상태 중에 하나가 선택된다고 할 수 있습니다. 예를들어, 회사의 홈페이지에 회사 소개를 하는 페이지가 있다고 생각해봅시다. 회사의 소개 그 자체는 추상화된 개념으로 resource라고 할 수 있습니다. 하지만, 회사의 소개를 json으로 할 수도 있고, html로 할 수도 있고 혹은 이를 다국어 지원으로.. 2023. 7. 13.
왜 많은 회사들은 READ COMMITTED를 사용할까? 한 줄 요약: 여러가지 이유가 더 있겠지만, Gap Lock으로 인한 Dead Lock 발생 문제가 크다.  사내에서 왜 READ COMMITTED를 쓰는지에 대한 질문과 답변을 보고, 공부하여 정리한 글입니다. 1. 왜 READ-COMMITTED를 사용할까 ?대부분의 서비스 회사는 MySQL을 쓰는 경우 READ COMMITTED를 사용한다고 합니다.MySQL은 default isolation-level이 REAPEATABLE-READ를 사용하고 있는데, 왜 READ-COMMITTED로 조정하여서 사용하고 있을까요?2. Gap lock 이란 무엇인가?참고: https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-gap-locksgap lo.. 2023. 7. 7.
Yagni (You aren’t gonna need it) (feat. 클린 아키텍처) https://martinfowler.com/bliki/Yagni.html 2023. 7. 2.
[단위테스트 2장] 단위 테스트란 무엇인가 2.1 단위테스트란? 작은 코드 조각(단위) 검증 빠르게 수행 격리된 방식으로 처리하는 자동화 테스트 격리라는 주체를 어떻게 보느냐에 따라 고전파와 런던파로 나뉘게 됨. 저자는 고전파의 입장으로 책을 설명하고 있다. 2.2 런던파 vs 고전파 격리주체 단위의 크기 테스트 대역 사용 대상 런던파 단위 단일 클래스 불변 의존성 외의 모든 의존성 고전파 단위 테스트 단일 클래스 또는 클래스의 세트 공유 의존성 런던파 한번에 하나의 클래스를 테스트함 입자성이 좋음, 한번에 한 클래스만 확인 서로 연결된 클래스의 그래프를 테스트하기 좋음 테스트가 어떤 기능이 실패했는지 확인하기 좋음 TDD 설계 방식 하향식 상위 레벨 부터 하위레벨에 대한 것은 목을 만들어서 협력자를 만들어 진행 모든 클래스 구현할 때까지 클래스.. 2023. 7. 2.
[단위테스트 1장] 단위테스트의 목표 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것 지속적인 정리와 리팩터링 등과 같이 적절한 관리를 하지 않고 방치하면 시스템이 점점 더 복잡해지고 무질서해진다 테스트가 있다면 이런 문제를 막을 수 있다 → 좋은 단위 테스트를 작성하는 것이 중요하다. 단위 테스트를 작성하는 것은 일종의 투자이고, 최대한의 이득을 얻을 수 있도록 노력해야 한다. 테스트 코드도 코드베이스의 일부이고, 좋은 테스트와 좋지 않은 테스트는 취향이나 선호도의 문제가 아니다. 단위테스트는 프로젝트의 성패를 가르는 중대한 문제이고, 잘못된 테스트 작성은 결국 프로젝트가 진행됨에 따라, 프로젝트의 성패를 좌우할 수 있다. 커버리지 지표 커버리지 지표는 좋은 부정지표이자, 나쁜 긍정지표이다. 커버리지가 낮으면, 개선이 필요하다... 2023. 7. 2.