전체 글(17)
-
[Kotlin] inline class
Inline class 왜 등장했나? 자바는 int, double 등 원시 타입이 존재하고 Integer, Double과 같은 원시 타입의 래퍼 클래스가 존재한다. 코틀린은 직접적인 래퍼 클래스를 제공하지는 않지만 Int, Double 등의 클래스는 필요에 의해 boxing 또는 unboxing 되며 때로는 원시타입처럼 때로는 래핑타입처럼 동작한다. 그런데 값 객체를 감싸서 사용하는 경우에 성능저하가 일어나는 문제가 발생하기 시작했다. 예를 들어, 갯수를 세는 객체를 class Count(val value: Int)이라는 클래스로 감싸서 사용하고 있었는데, 이 객체가 코드 상에서 너무 많이 생성되고 사라지는 빈도가 높다보니 JVM에 너무 많은 부하를 주는 것이다. 특히 Int 같이 원시타입으로 동작하는 ..
2021.04.09 -
[객체지향] 캡슐화 - 객체의 값을 꺼내지 말고 메시지를 던져라
객체지향을 학습하다보면 캡슐화 라는 용어가 나온다. 위키를 보면 캡슐화의 정의는 다음과 같다. 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉한다. 얼핏보면 무슨 말인지 이해가 잘 되지 않지만, 핵심은 내부 구현을 외부에 드러내지 않는다는 점이다. 처음 캡슐화란 개념을 접하면 위와 같은 표현은 잘 와닿지 않는다. 그렇다면 어떻게 이를 코드에서 실천할 수 있을까? 가장 간단한 방법은 객체에서 값을 꺼내지 말고, 객체에 메시지를 던지는 방법이다. 이를 코드 레벨에서 적용한다면 로직에 getter를 사용하지 않는다라고 할 수 있겠다. 아래 예시를 보며 확인해보자. 자동차 경주 게임을 구현한다고 하면 우리는 Car 객체를 다음과 같이 ..
2021.01.24 -
[Spring Data Jdbc] 코틀린에서 wither를 인식하지 못하는 문제
자바에서 Spring Data Jdbc 사용할 때 setter 없이 id를 채워주려면(populate) 다음과 같이 Wither를 만들어주면 된다. @Getter @RequriedArgsConstructor public class Menu { @Id private final Long id; private final String name; private final double price; public Menu(String name, double price) { this(null, name, price); } public Menu withId(Long id) { return new Menu(id, name, price); } }코틀린에서도 다음과 같이 wither를 만들어주면 작동하겠거니 했다. class ..
2020.12.06 -
[Spring] Transactional Rollback
프로젝트를 진행하다가 알 수 없는 예외 때문에 고생한 경험을 바탕으로 이번 포스트를 쓴다. 해결하는 데 이 글이 정말 많은 도움이 됐다. 저 글보다 더 자세하고, 전문성 있는 설명을 할 수는 없어서 조금 더 간단하고, 직관적으로 풀어보려고 한다. 이번 포스트에서 사용한 로그 레벨은 다음과 같다. logging.level.org.springframework.jdbc.core.JdbcTemplate=debug logging.level.org.springframework.jdbc.core.StatementCreatorUtils=trace logging.level.org.springframework.transaction=trace 문제의 시작 `@Transactional`이 걸려 있는 메서드 내부에서 `Unex..
2020.08.03 -
[Jenkins] Docker를 활용한 Spring boot 프로젝트 CI & CD
혼자 생각한대로 배포를 진행해봤는데, 이렇게 하는게 맞는지 아직 잘 모르겠다. 포스팅에 문제점이나 잘못된 점이 있다면 피드백을 받을 수 있으면 좋겠다. Docker 설치 먼저, AWS ec2 인스턴스를 하나 준비하고, 터미널에서 apt-get을 업데이트 해준 뒤, 도커를 받는다. $ sudo apt-get update $ sudo apt-get -y upgrade $ curl -fsSL https://get.docker.com/ | sudo sh ... $ docker --version 위 명령으로 설치한 도커는 모두 root 권한으로 실행해야한다. 따라서, 현재 유저에게 docker를 사용할 수 있는 권한을 주기 위해 다음 커맨드를 실행한다. $ sudo usermod -aG docker $USER $..
2020.07.26 -
[Jackson] Jackson 파싱 전략(불변 객체 활용)
웹 프로그래밍을 하다보면 Json을 객체로, 객체를 Json으로 변환해야 할 일이 많다. Spring boot는 이러한 오브젝트 매핑의 기본 전략으로 Jackson을 사용한다. 별다른 설정 없이 Spring boot를 사용한다면 Jackson을 사용하고 있는 것이다. ObjectMapper 활용 Jackson은 오브젝트 매핑을 위해 ObjectMapper라는 객체를 제공한다. new ObjectMapper()를 통해 생성할 수도 있고, 스프링 컨테이너를 통해 주입받을 수도 있다. 객체를 JsonString으로 변환하고 싶으면 Objectmapper.writeValueAsString(object) 메서드를 사용하면 되고, 반대로 JsonString에서 객체로 변환하고 싶으면 ObjectMapper.read..
2020.07.12