<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>myner</title>
  <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh" />
  <author>
    <name>myner</name>
  </author>
  <subtitle>'언어와 프레임워크는 선택의 문제이고 플랫폼은 문제 해결의 수단'이라 생각합니다. 레거시코드 리팩토링, OOP, FP, 클린코드, 테스트 좋아합니다 :)</subtitle>
  <id>https://brunch.co.kr/@@2aeh</id>
  <updated>2016-07-12T13:12:09Z</updated>
  <entry>
    <title>Temporal Coupling - oop가 fp보다 좋은이유?!</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/83" />
    <id>https://brunch.co.kr/@@2aeh/83</id>
    <updated>2022-09-22T09:05:59Z</updated>
    <published>2022-04-04T15:08:46Z</published>
    <summary type="html">Coupling 이란 무엇인가? 우리는 일반적으로 코드의 일부가 서로 관련되어 있는 경우 커플링이 높다고 보고 관련이 없거나 전혀 없는경우 커플링을 낮다고 본다  print('Hello!');  print('What is your name?');  이 두 코드는 연결 되어있을까? 그럴수도 있고 아닐 수도 있다.   print('Orange');  print&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0.fjpg/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FcfqZNgR8R9vsUN7zYl9G_amko-E.jpeg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>기술 선택과 좋은 구현에 대한 이야기 - feat. 딜레마</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/82" />
    <id>https://brunch.co.kr/@@2aeh/82</id>
    <updated>2022-08-29T10:36:20Z</updated>
    <published>2022-02-09T11:19:40Z</published>
    <summary type="html">개발하면서 좋은 구현이란 무엇일까? 앞으로의 이야기는 당연한 소리일 수 있고 아닐 수도 있지만 가끔 질문을 받아서 한번 글을 써본다.    좋은 구현이란?  필자가 생각하는 좋은 구현이란 코드의 가독성이 좋아야 하며, 변경에 유연하고, 테스트 코드 작성이 쉬운 것이라 생각한다. 근데 과연 이것뿐일까? 이 세가지도 중요하지만 정말 중요한 것은 비즈니스 가치를&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FfSiGtnnVzRHFpSj0svqNdmHHGWI.png" width="473" /&gt;</summary>
  </entry>
  <entry>
    <title>언어와 프레임워크는 선택의 문제이고, - 플랫폼은 문제 해결의 수단이다</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/78" />
    <id>https://brunch.co.kr/@@2aeh/78</id>
    <updated>2022-04-20T15:00:24Z</updated>
    <published>2022-01-11T01:27:50Z</published>
    <summary type="html">가끔 오픈카톡방이나 주위의 분들이 묻는 질문이 있다.  Q: 자바를 모르는데 코틀린을 하는 게 나을까요? Q: 파이썬을 하는 게 나을까요? 자바를 하는 게 나을까요?  나는 항상 대답한다. 하고 싶은 거 더 끌리는 거 하시면 됩니다. 또는 가고 싶은 기업이 있다면 해당 기업이 원하는 기술 스택으로 하시면 됩니다. 깊게 파다 보면 다르지만 비슷한 부분도 많습&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0.fjpg/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2F_cgagkNfKRRcy-W7nVZBmwREGIA.jpeg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>트래픽이 증가할 때 ... - feat. 제발~~ 그만해~~ 이러다 다 죽어~~!!!</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/73" />
    <id>https://brunch.co.kr/@@2aeh/73</id>
    <updated>2021-12-30T00:39:23Z</updated>
    <published>2021-12-09T08:28:00Z</published>
    <summary type="html">필자는 트래픽이 급증하는 케이스를 크게 두 가지로 분리할 수 있다고 본다.  1. 정해진 날짜 없이 갑작스러운 이벤트 발생   - ex: 긴급 뉴스, 재해재난 상황, 올림픽 경기중 특정 이벤트 발생 시 2. 정해진 날짜의 예견된 트래픽 증가    - ex: 마케팅 이벤트, 새해맞이 메신저, 복날의 배달, 올림픽 경기  우리는 어떻게 대응해야 할까? 가 이번&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2Ff04iQ0JyjsdIYJ75O2hlVGTMV6U.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>다르지 않다, 이랬어야 했다 - feat. Declarative Programming</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/68" />
    <id>https://brunch.co.kr/@@2aeh/68</id>
    <updated>2023-07-11T22:48:29Z</updated>
    <published>2021-11-20T15:37:43Z</published>
    <summary type="html">Professor Odersky님의 제자가 되었다. 교수님은 날 모르시지만 나는 제자가 되었다. 스위스 로잔 연방 공과대학교를 다니면서 찐제자가 되고싶지만 능력의 한계가 명확하므로... 이렇게 만족하겠다.. 함수형 프로그래밍을 공부하면서 느낀 점이 있는데 그것이 엘레강트 오브젝트 책에서 말하던 부분과 결이 같아서 엘레강트 오브젝트 내용과 함께 느낌 점의 썰&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2F2h7KExlsswm11tvT1BYouyT9svY.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Testable Code 마지막 - feat. SRP</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/66" />
    <id>https://brunch.co.kr/@@2aeh/66</id>
    <updated>2022-02-11T06:28:28Z</updated>
    <published>2021-08-20T04:52:16Z</published>
    <summary type="html">우리는 테스트 코드를 작성하기 힘든 코드를 많이 보았고 많이 만들어 냈을것이다. 이번 글은 어떻게하면 테스트하기 좋은 코드를 만들어 갈것인지에 대한 이야기이다(원문).   결함.&amp;nbsp;클래스가 많은 일을 수행  클래스에는 너무 많은 책임이 있으면 안된다. 클래스는 SRP(Single Responsibility Principle) 단일 책임의 원칙을 지켜야한다. &lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2F9fhKm0jYlEgNtJnnmV0YCasMNcQ.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Testable Code 3 - feat. static</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/65" />
    <id>https://brunch.co.kr/@@2aeh/65</id>
    <updated>2021-08-20T05:35:30Z</updated>
    <published>2021-08-20T04:51:31Z</published>
    <summary type="html">우리는 테스트 코드를 작성하기 힘든 코드를 많이 보았고 많이 만들어 냈을것이다. 이번 글은 어떻게하면 테스트하기 좋은 코드를 만들어 갈것인지에 대한 이야기이다(원문).   다루기 힘든 Global State와 Singletons 결함  Global State와 Singleton은 API가 진정한 종속성에 대해 거짓말을 하도록 만듭니다. 종속성을 제대로 이해&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0.fjpg/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FGAjzCli2R2b_rOUP1IsA7e04lmI.jpeg" width="369" /&gt;</summary>
  </entry>
  <entry>
    <title>Testable Code 2 - feat. collaborators</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/64" />
    <id>https://brunch.co.kr/@@2aeh/64</id>
    <updated>2022-10-10T10:57:44Z</updated>
    <published>2021-08-20T04:51:21Z</published>
    <summary type="html">우리는 테스트 코드를 작성하기 힘든 코드를 많이 보았고 많이 만들어 냈을것이다. 이번 글은 어떻게하면 테스트하기 좋은 코드를 만들어 갈것인지에 대한 이야기이다(원문).   Digging into Collaborators 결함  'holder', 'context' 등의 객체들(모두 메소드에서 직접적으로 필요한 Sepecific Object에 대한 접근을 제공&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2Ftz4P9lYqypr9X9h---8831bySPo.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>Testable Code 1 - feat.&amp;nbsp;constructor</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/63" />
    <id>https://brunch.co.kr/@@2aeh/63</id>
    <updated>2022-10-10T10:57:11Z</updated>
    <published>2021-08-20T04:50:27Z</published>
    <summary type="html">우리는&amp;nbsp;테스트 코드를 작성하기 힘든 코드를 많이 보았고 많이 만들어 냈을것이다. 이번 글은 어떻게하면 테스트하기 좋은 코드를 만들어 갈것인지에 대한 이야기이다(원문).   Constructor does Real Work 결함  constructor에서 'collaborator를 생성/초기화', '다른 service와 상호작용', '자기 자신의 상태설정' 과&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FTk_ETEdvqIHUqvbpk1bgkvZqBpw.jpg" width="320" /&gt;</summary>
  </entry>
  <entry>
    <title>레거시 코드에 테스트코드 추가와 리팩터링 하기 - feat. 머리에 쥐남</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/62" />
    <id>https://brunch.co.kr/@@2aeh/62</id>
    <updated>2022-01-23T09:22:22Z</updated>
    <published>2021-07-23T06:46:15Z</published>
    <summary type="html">우리는 레거시 코드를 늘 만나게되고 수정해야한다. 그 레거시 코드에는 테스트코드가 없을 수 있고 그러면 수정하거나 리팩터링할때 매우 불안하다..  그래서 이번에 레거시 코드에 테스트코드를 추가하면서 리팩터링하는 방법을 정리해보려 한다. 진행할 예제는 &amp;nbsp;stingleton, static method call을 가지고 있어서 testing하기 어려운 코드이다.&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0.fjpg/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FBtTmShBaSBSszOvXVlIOCb9WDQU.jpeg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>도메인 모델이란? - from 오브젝트</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/56" />
    <id>https://brunch.co.kr/@@2aeh/56</id>
    <updated>2022-05-14T09:09:05Z</updated>
    <published>2021-04-14T13:19:11Z</published>
    <summary type="html">도메인이란 사용자가 프로그램을 사용하는 대상 영역  모델이란 지식을 선택적으로 단순화하고 의식적으로 구조화한&amp;nbsp;형태  도메인 모델이란 사용자가 프로그램을 사용하는 대상&amp;nbsp;영역에 대한 지식을 선택적으로 단순화하고 의식적으로 구조화한 형태이다  도메인 모델은 단순히 클래스 다이어그램이&amp;nbsp;아니다. 도메인의 핵심을 간략하게 단순화해서 표현할 수 있는 모든&amp;nbsp;것이 도메인&amp;nbsp;</summary>
  </entry>
  <entry>
    <title>피처 엔지니어링 / 선택하기 - feat. 머신러닝</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/55" />
    <id>https://brunch.co.kr/@@2aeh/55</id>
    <updated>2021-04-04T13:58:26Z</updated>
    <published>2020-11-19T15:41:06Z</published>
    <summary type="html">필자는 최근 머신러닝을 이용한 프로젝트를 진행하고 있는데 공부할 때도 느끼고 플젝 진행할때도 느끼고 또 느끼는&amp;nbsp;부분이 있다.  바로 '피처 엔지니어링' 그리고 '피처 선택'이 핵심기능의 일부로 고려되어야 한다는 점이다. 흔히들 말하는 '쓰레기가 들어가면 쓰레기가 나온다'&amp;nbsp;라는 것과 비슷한 맥락이다.  피처 엔지니어링에서는 새로운 피처를 생성하는 것도 포함이&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FcLWH_GbRvndH7iaUasA51zrLrzs.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 ChannelPipeline - feat. 네티 Channel</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/51" />
    <id>https://brunch.co.kr/@@2aeh/51</id>
    <updated>2020-11-09T10:47:12Z</updated>
    <published>2020-11-08T13:38:12Z</published>
    <summary type="html">Channel &amp;amp; ChannelPipeline 구성관계 ChannelHandlerContext로 구성된 양방향 연결 목록을 유지하고 있음을 알 수 있다. 연결 목록의 헤드는 HeadContext, 연결 목록의 끝은 TailContext, 각 ChannelHandlerContext는 연결된 목록이다. ChannelHandler.   protected Abst&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FN03UZ7HG9gFbQ_18xTOYcYm-u9U.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 ByteBuf - feat. 디자인 패턴</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/48" />
    <id>https://brunch.co.kr/@@2aeh/48</id>
    <updated>2020-11-09T10:46:56Z</updated>
    <published>2020-11-08T13:33:59Z</published>
    <summary type="html">ByteBuf&amp;nbsp;는&amp;nbsp;Netty 프레임 워크에서 가장 중요한 클래스 중 하나이며 간단히 말해서 ByteBuf는 java.nio.ByteBuffer의 Netty 버전이다.  ByteBuf 논리 구조 클래스 이름에서 알 수 있듯이 ByteBuf는 논리적으로 바이트 컨테이너이다. ByteBuf의 데이터는 다음 그림과 같이 두 개의 포인터로 세 부분으로 나뉜다.  r&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FsVkUsRNKXfaHst2AF0zK4z5YjNc.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 NioEventLoop</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/50" />
    <id>https://brunch.co.kr/@@2aeh/50</id>
    <updated>2021-05-12T06:57:35Z</updated>
    <published>2020-10-18T08:59:34Z</published>
    <summary type="html">NioEventLoop  NioEventLoop는 SingleThreadEventLoop에서 상속되고 SingleThreadEventLoop는 SingleThreadEventExecutor에서 상속된다.  SingleThreadEventExecutor는 Netty의 로컬 스레드를 추상화 한 것이다. 내부에 Thread 스레드 속성이 있고 로컬 Java 스레&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2F7eNGg2i6ZkegWzHi_wGiuRl7l7c.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 NioEventLoopGroup - feat. 스레드 풀</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/49" />
    <id>https://brunch.co.kr/@@2aeh/49</id>
    <updated>2020-10-18T10:40:38Z</updated>
    <published>2020-10-18T08:08:56Z</published>
    <summary type="html">NioEventLoopGroup NioEventLoopGroup 객체는 내부적으로 스레드 그룹을 유지하는 스레드 풀로 이해할 수 있다.  각 스레드는 여러 채널에서 이벤트를 처리하고 채널은 하나의 스레드에만 해당하므로 여러 스레드에서 데이터 동기화 문제를 피할 수 있다.  Reactor 스레드 모델 세 가지 Reactor 스레딩 모델이 있다. 단일 스레드 &lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FfHk8GcKSQut6f188kPR7E9mB10M.png" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 BootStrap/ServerBootStrap - feat. Netty BootStrap, ServerBootStrap</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/46" />
    <id>https://brunch.co.kr/@@2aeh/46</id>
    <updated>2021-04-13T07:28:11Z</updated>
    <published>2020-10-12T13:19:33Z</published>
    <summary type="html">BootStrap/ServerBootStrap 부트 스트랩은 Netty에서 제공하는 편리한 팩토리 클래스이며 Netty 클라이언트 측 또는 서버 측 Netty 초기화를 완료하는 데 사용할 수 있다. 두 클래스다 AbstractBootstrap 클래스를 상속하고 있어서 코드를 분석 할 때 부모클래스와 자식클래스를 잘 넘나들며 봐야 한다.  주요 요소  Cha&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FU3yvN068MqlB06rMOLxYXfM5L0k.png" width="318" /&gt;</summary>
  </entry>
  <entry>
    <title>네티 - feat. 자바 네트워크 소녀</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/45" />
    <id>https://brunch.co.kr/@@2aeh/45</id>
    <updated>2020-10-12T15:06:59Z</updated>
    <published>2020-10-11T14:02:19Z</published>
    <summary type="html">Netty NIO기반 고성능 비동기식 Evnet-Driven 네트워크 어플리케이션 프레임워크 (https://github.com/netty/netty, https://netty.io/)  필자는 네티의 팬이기도한데 이 네티는 존경에 마지않는 이희승 님께서 학부 시절 개인 프로젝트로 시작... 하셨다고한다. (나는 학부 때 무엇을 한 거지.....)  유수의&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FiOss_5zPf-C2CfqHFe-aQrcyBUE.png" width="318" /&gt;</summary>
  </entry>
  <entry>
    <title>자바 NIO - feat. 친구의 팩폭</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/47" />
    <id>https://brunch.co.kr/@@2aeh/47</id>
    <updated>2023-06-27T10:30:36Z</updated>
    <published>2020-10-11T12:58:15Z</published>
    <summary type="html">자바는 어디서 느릴까?  일단 자바는 C/C++과 달리&amp;nbsp;직접 메모리를 관리하고 OS 레벨의 시스템 콜을&amp;nbsp;직접 사용하기는 어렵다. JNI를 사용하는것은 여기서는 배제하도록 하자.&amp;nbsp;자바는 JVM&amp;nbsp;위에서 동작하므로 주로 C/C++에 비하면&amp;nbsp;자바는 느리다고 인식되고 실제로도 그렇다.  (여담: 친구들과 자바는 느리다 C++이 빠르다 어쩌구저쩌구&amp;nbsp;토론할 때.. 어느&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FNuTg8ZFXtlOZqRv7dCBDwCmX4Rc.jpg" width="500" /&gt;</summary>
  </entry>
  <entry>
    <title>리액터패턴 / 프로액터패턴 - feat. Netty, java NIO</title>
    <link rel="alternate" type="text/html" href="https://brunch.co.kr/@@2aeh/42" />
    <id>https://brunch.co.kr/@@2aeh/42</id>
    <updated>2021-08-18T10:39:37Z</updated>
    <published>2020-10-11T12:13:13Z</published>
    <summary type="html">리액터 패턴  Reactor 패턴은 하나 이상의 클라이언트로부터의 요청을 동시 처리하기 위해서 사용하는 패턴이다. 이벤트 핸들 패턴의 전형적인 모습이다.&amp;nbsp;서버는 각 입력에 대해서 받을 이벤트를 동적으로 등록/해제하는 식으로 처리해야 할 입력과 이벤트를 관리할 수 있다.  어플리케이션이 능동적으로 계속해서 처리하기위한 루프를 도는 것이 아니라, 이벤트에 반응&lt;img src= "https://img1.kakaocdn.net/thumb/R1280x0/?fname=http%3A%2F%2Ft1.daumcdn.net%2Fbrunch%2Fservice%2Fuser%2F2aeh%2Fimage%2FCeTY5ymGNBfAxFAYkE1Qb4K-7Es.jpg" width="500" /&gt;</summary>
  </entry>
</feed>
