본문 바로가기

TIL

(56)
2022/03/07 TIL Java8 Default Method 자바8 부터는 인터페이스에 default 메소드(구현이 있는 메소드)를 사용할 수 있다. 다양한 사용방법이 있겠지만 '원하는 메소드만 구현'하고 싶을 때 사용할 수 있다는 것을 알게 되었다. Spring에 WebMvcConfigurer interface가 있는데 자바7 까지는 default 메소드가 없기 때문에 WebMvcConfiguereAdapter라는 추상 클래스를 사용하여 원하는 메소드를 재정의 했었다. 하지만 자바8이 나오면서 WebMvcConfiguereAdapter는 Deprecated 되었고 WebMvcConfigurer를 바로 구현하게 되었다. 토비의 스프링 3.1 오브젝트의 설계와 구현, 동작원리에 더 집중하기를 바란다. 그러다 보면 ..
2022/03/03 TIL 자바 병렬 프로그래밍 경쟁 조건은? 여러 스레드를 교차해서 실행하는 상황에 따라 계산의 정확성이 달라질 때 나타난다. 정수형 변수값을 여러 스레드가 접근하여 변경하는 경우를 생각해보면 될 것 같다. 경쟁 조건이란 용어를 만들 정도로 중요한 개념이란 것을 알고 넘어가야겠다. 점검 후 행동이란? 잠재적으로 유효하지 않은 관찰 결과로 결정을 내리거나 계산을 하는 것 점검 후 행동의 예시로는 늦은 초기화(lazy initialization)가 있다. public class LazyInitRace { private Person instance = null; public Person getInstance(){ if (instance == null){ instance = new Person(); } return in..
2022/03/02 TIL 자바 병렬 프로그래밍 모든 자바 프로그램은 기본적으로 스레드를 사용한다. JVM을 시작시키면 main 메소드를 실행할 주 스레드 뿐 아니라 가비지 컬렉션이나 객체 종료와 같은 내부 작업을 담당할 스레드도 생성한다. JAVA가 동작하는 원리를 알기 위해서는 병렬 처리에 대한 이해가 더 높아야 한다는 생각을 했다. 병렬 프로그램은 단순하게 스레드와 락만 신경 써서 될 일은 아니다. 하지만 스레드와 락은 그저 목적을 위한 도구일 뿐이다. 근본적으로 공유되고 변경할 수 있는 상태에 대한 접근을 관리하는 것이다. 병렬 처리하면 JAVA에서는 자연스럽게 '스레드'와 '락(lock)' 같은 단어들이 떠오르기 마련이다. 이번 기회에 도구가 아닌 본질에 대해 고민해보고 싶다. 스레드 안전한 ..
2022/02/28 TIL 무어의 법칙 반도체 집접 회로의 성능이 24개월마다 2배로 증가하는 법칙이다. 인텔의 공동 설립자인 고든 무어가 1965년에 내놓은 것이다. "법칙"이라는 말은 캘리포니아 공과대학의 교수와 사업가에 따른 것이다. 반도체 메모리칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 18개월에서 24개월마다 2배씩 향상된다는 '기술 개발 속도에 관한 법칙'이다. 컴퓨팅 성능은 18개월마다 2배씩 향상된다. 컴퓨터 가격은 18개월마다 반으로 떨어진다. 현재는 사실상 무어의 법칙이 의미가 없다. 참고 암달의 법칙 진 암달이라는 컴퓨터 과학자이자 기업가의 이름에서 따왔다. 컴퓨터의 개수가 아무리 늘어나더라도 속도의 한계는 정해져있기 때문에 암달의 법칙은 암달의 저주로도 불리며 컴퓨터 시스템의 일부를 개선..
2022/02/24 TIL 클린 아키텍처 27장 : '크고 작은 모든' 서비스들 자바의 경우, 서비스를 하나 이상의 jar 파일에 포함되는 추상 클래스들의 집합이라고 생각하라. 이런 관점에서 하나의 서비스는 인터페이스로 만들어지는 게 좋다고 생각한다. 클린 아키텍처 28장 : 테스트 경계 시스템 내부의 어떤 것도 테스트에는 의존하지 않으며 항상 원의 안쪽으로 의존한다. 테스트뿐만 아니라 의존성이 높아지면 변경하기 어려운 코드가 된다. 특히 테스트는 운영이 아닌 개발을 지원하는 데에 있기 때문에 의존성이 낮아야 한다. 소프트웨어 설계의 첫 번째 규칙은 언제나 같다. '변동성이 있는 것에 의존하지 말라' 의존성이 높아질수록 테스트하기 힘들어 지고 그 이유 중 변동성이 높아지는 것도 하나이다. 이를 줄이기 ..
2022/02/23 TIL 클린 아키텍처 26장 : 메인 컴포넌트 메인은 모든 팩토리와 전략, 그리고 시스템 전반을 담당하는 나머지 기반설비를 생성한 후, 시스템에서 더 높은 수준을 담당하는 부분으로 제어권을 넘기는 역할을 맡는다. 스프링에서 main이 실행되면 Bean을 등록하는(메모리에 올리는) 과정이 생각났다. 메인은 클린 아키텍처에서 가장 바깥 원에 위치하는 지저분한 저수준 모듈이라는 점이다. 고수준의 모듈(주로 개발자가 작성하는 변경이 많은 모듈)이 수정되어도 main을 수정할 필요가 없어진다.
2022/02/22 TIL 클린 아키텍처 25장 이 예제를 가져온 이유는 아키텍처 경계가 어디에나 존재한다는 사실을 보여주기 위함이다. 25장에서는 간단한 게임을 만드는데 여러 개의 경계를 도출하는 예시를 보여준다. 이 부분에서 Service와 SerivceImpl를 만드는 관습적인 행위 역시 경계를 만든 것이 맞을까 라는 생각을 했다. 또한 DAO를 제외하고 추가적인 경계를 만드는 데에 내가 소극적이라는 것을 알게 되었다. YAGNI(you aren't going to need it) 오버 엔지니어링이 언더 엔지니어링 보다 나쁠 때가 훨씬 많다. 아키텍처 관점에서는 스스로 그림이 확실히 그려지고 수정하는 게 좋다는 것 같다. 경계가 존재하지 않는 상황에서 경계가 필요하다는 사실을 발견하면 비용이 많이 들고 위험을 감수해야 한다...
2022/02/21 TIL 클린 아키텍처 23장 : 프리젠터와 험블 객체 험블 객체 패턴이란? 테스트하기 어려운 행위와 쉬운 행위를 분리하기 쉽게 하는 방법 테스트하기 어려운 행위는 험블 객체로 옮기고 나머지 테스트하기 쉬운 행위를 옮긴다. 단위 테스트를 하다 보면 복잡도가 높아 어려운 경험이 있는데 험블 객체에 테스트하기 어려운 부분을 옮긴다는 아이디어가 정말 좋다고 생각했다. 클린 아키텍처 24장 : 부분적 경계 Service, ServiceImpl이 미래에 필요한 아키텍처 경계를 위한 무대를 마련한다는 점은 명백하다. 아직도 관습적으로 Interface를 만드는 것에 대해서는 동의하지 않는다. 스스로 납득할만한 근거를 아직 못 본 것 같다. 아키텍처 경계가 언제, 어디에 존재해야 할지, 경계를 완벽하게 아니면 부분적으로 구현..
2022/02/19 TIL 클린 아키텍처 22장 : 클린 아키텍처 육각형 아키텍처를 포함한 대부분의 아키텍처의 목표는 관심사의 분리다. 요즘 육각형 아키텍처에 대한 의견이 많이 들리는 것 같은데 주요 목표는 관심사의 분리라는 것을 알게 되었다. 엔티티는 전사적인 핵심 업무 규칙을 캡슐화한다. 외부의 무언가가 변경되더라도 엔티티가 변경될 가능성은 지극히 낮다. 핵심 업무 규칙을 이 서비스 레이어에 있는 경우가 많다. 앞으로 개발할 때 외부로부터 의존성을 최대한 줄이기 위해 엔티티와 가깝게 하고 싶다. 유스 케이스는 특화된 업무 규칙을 포함한다. 엔티티가 자신의 핵심 업무 규칙을 사용해서 유스 케이스의 목적을 달성하도록 이끈다. 유스 케이스의 구현은 엔티티에 있어야 한다. 원은 네 개여야만 하나? 그렇지 않다. 더 많은 원이 필요할 ..
2022/02/18 TIL Spring Boot 3.0.0 M-1 SpringBoot 3.0부터는 Java17, Spring Framework6 이상을 사용해야 한다. 추가적으로 알아두면 좋을점은 Java EE API에서 Jakarta EE(Jakarat EE 9)로 변경한다는 점이다. 참고1 참고2 Jakarta EE 오라클이 JAVAEE8 릴리즈를 마지막으로 비영리 단체인 이클립스 재단에 JAVA EE로 프로젝트를 이관했습니다. 자바 상표권은 계속 오라클이 가지고 있기 때문에 네임스페이스를 Jakarta로 변경했습니다. 참고3 참고4 JAX-RS Java API for RESTful Web Services의 약자로 경량화된 방식을 제공하는 자바 API 이며 JavaEE에 JAX-RS 라는 사양이 들어있다. (Jakarta EE..