1. 값 객체(Value Object)와 불변성(Immutablity)[ 값 객체(Value Object) 와 참조 객체(reference object) ]프로그래밍을 하다 보면, 사물을 복합적으로 표현하는 것이 유용한 때가 있다. 예를 들어, 좌표는 x 값과 y값으로 표현될 수 있고, 금액은 숫자와 통화로 구성될 수 있다.class Point( val x: Int, val y: Int,) 이때 두 객체가 동일한지를 판단해야 하는 경우가 있는데, 예를 들어 두 Point 객체가 모두 (2, 3)이라는 좌표를 나타낸다면, 이를 동일하게 취급하는 것이 합리적일 수 있다.val p1 = Point(2, 3);val p2 = Point(2, 3);check(p1 == p2) 이렇듯 속성 값에 의해..
1. 소프트웨어 엔지니어링이란?구글에서는 이따금 “소프트웨어 엔지니어링은 흐르는 시간 위에서 순간순간의 프로그래밍을 모두 합산한 것이다”라고 말하곤 합니다. 소프트웨어 엔지니어링에서 프로그래밍이 큰 비중을 차지하는 건 틀림없지만 프로그래밍은 결국 새로운 소프트웨어를 제작하는 수단입니다. 여러분이 이 차이를 받아들인다면 자연스럽게 프로그래밍 작업(개발, development)과 소프트웨어 엔지니어링 작업(개발, development + 수정, modification + 유지보수, maintenance)의 차이도 궁금할 것입니다. 시간이라는 요소가 더해지면서 프로그래밍에는 중요한 차원이 하나 늘어서 더 입체적으로 바뀝니다. 정육면체는 정사각형이 아니고 거리는 속도가 아니듯, 소프트웨어 엔지니어링은 프로그래밍..

1. 자바 스레드의 여러 가지 상태들[ 여러 종류의 스레드 상태들(Thread State) ]자바 공식 문서(자바 23 기준)에 따르면 다음과 같은 자바 스레드 상태가 존재한다.NEW스레드가 생성되었으나 아직 시작되지 않은 상태아직 OS 스레드는 아직 존재하지 않으며, Thread.start()를 호출해야 OS가 실제로 스레드를 생성하도록 신호를 보냄RUNNABLE스레드가 실행 가능하여 운영 체제의 자원(예: 프로세서)을 기다리고 있거나 JVM 내에서 실행중인 상태운영체제의 스케줄러가 각 스레드에 CPU 시간을 할당하여 실행하므로, Runnable 상태의 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행됨BLOCKED스레드가 모니터 락(동기화 락)을 기다리며 블록된 상태이 상태의 ..
아래는 자바 언어 아키텍트인 Brian Goetz의 “Background: how we got the generics we have (Or, how I learned to stop worrying and love erasure)” 포스팅을 재구성하여 작성한 것입니다. 해당 포스팅은 현재의 제네릭에 도달하게 된 과정과 그 이유에 초점을 맞추고, 현재 제네릭이 우리가 구축하려는 "더 나은" 제네릭에 어떤 영향을 미칠지에 대한 토대를 마련하기 위해 작성되었습니다. 특히 2004년 Java에 제네릭을 추가하기 위해 소거가 실제로 합리적이고 실용적인 선택이었음을 강조하며, 소거로의 전환을 선택하게 한 많은 강요들이 지금도 여전히 작동하고 있을 수 있음을 강조하고자 합니다. 1. 오늘날의 제네릭이 되기까지 제..
1. 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deserializer)의 종류와 한계서비스를 개발하다 보면 레디스(Redis)는 사실상 필수불가결한 구성 요소라고 볼 수 있다. 따라서 스프링 진영 역시 레디스를 손쉽게 사용할 수 있도록 캐시 추상화를 해줄 뿐만 아니라, 레디스의 자동 구성(AutoConfiguration) 등을 제공한다. 뿐만 아니라 레디스는 기본적으로 byte 배열을 사용해 데이터를 저장하기 때문에, 스프링 데이터 레디스(spring-data-redis) 에서는 데이터를 직렬화하여 레디스에 저장하고, 필요 시에 역직렬화하는 직렬화/역직렬화 도구까지 기본적으로 제공한다.하지만 스프링이 제공하는 레디스 직렬화/역직렬화(Redis Serializer/Deseri..