개발자의 필독서라고 선정될 만큼, 개발자로서 태도/마인드/전략에 대한 이야기를 담고 있습니다. 개발자로서 답답함이 많은 요즘, 저에겐 이 책 한권이 힐링으로 다가옵니다. 그 중에서도 눈길이 가는 세 이야기를 발췌했습니다. 1. 제자리 걸음 벗어나기 ( 성장!(몰입)하는 환경으로 변화하기 ) 개발을 할 때 실력과 작업난이도가 비슷하면, 작업에 몰입할 수 있고 성장 할 수 있는 환경이라고 합니다. 그런데, 비슷하지 않으면 지루함이나 불안함을 느끼게 됩니다. 지루함과 불안함을 느끼면, 성장할 수 없는 환경이라고 필자는 말합니다. 지루함을 느끼는 케이스는 "실력 > 작업의 난이도"인 케이스이고, 불안함을 느끼는 케이스는 "작업의 난이도 > 실력"인 케이스 입니다. 이 두 케이스에 대해 몰입이 가능한 상태로 가기..
최근 회사 제품의 개선안을 조사할 당시 배포자동화를 위해 Docker를 조사하게되었다. Docker의 컨테이너 안에 jar, jdk, postgreSQL 등을 설치 해놓고 Docker hub에 push 후 pull 한다면, 솔루션을 새로운 곳에 배포 할 때 혹은 신규입사자가 들어왔을 때 한 번에 개발환경을 구축할 수 있을 것이라는 기대감 때문이었다. 하지만, 아쉽게도 환경셋팅 자동화를 쉘스크립트로 하자는 의견으로 좁혀졌다. 수 많은 사용자가 있는 서비스들도 쿠버네티스, 도커를 통해서 Devops 하고 있는 시점에 쉘스크립트로만 환경셋팅을 자동화하자는 말이 매우 아쉬웠다. 하지만, Docker를 조금이라도 사용할 수 있게 되었다. 쉘스크립트 작성 및 환경설정 테스트를 개발서버에서 자유롭게 진행하기에는 다소..
최근 DDD, MSA를 이해하기 위해 지인들과 작은 사이드 프로젝트를 진행하고 있습니다. 모두, 직장인 개발자로 구성되어 있기에 본업처럼 많은 에너지를 쏟고 있지는 못하지만, 그래도 모두 시간을 쪼개어 열정적으로 진행하니 즐겁습니다. DDD, MSA란 말은 참 많이 들었는데 그 과정들을 실무에서 적용 해보기 어려워 많이 궁금했습니다. 책을 봐도 이해가 잘 되지 않았습니다. https://youtu.be/QUMERCN3rZs 위 영상을 참고하여, 4가지 색의 포스트 잇을 이용하여 파란색 : command 노란색 : item 주황색 : event 빨간색 : external ( 외부시스템 ) 기능을 나누고 요청 과정을 포스트잇으로 정리합니다. 정리한 내용을 바탕으로 같은 데이터 요청에 해당하는 경우를 한 곳에..
정적팩터리와 생성자 모두 선택적 매개변수가 많을 때 적절히 대응하기가 어렵다. 매개변수가 많을 때 사용할 수 있는 방법들을 살펴보자. 점층적 생성자 패턴 public class NutrionFacts { private final int servingSize; //필수 private final int servings; //필수 private final int calories; //선택 private final int fat; // 선택 private final int sodium; // 선택 private final int carbohydrate; // 선택 public NutrionFacts(int servingSize, int servings) { this(servingSize, servings, 0)..
public class UtilityClass { // 기본 생성자가 만들어지는 것을 막는다. (인스턴스화 방지용) private UtilityClass() { throw new AssertionError(); } ... (생략) } 이따금 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있을 것이다. - java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드 - java.Util.Collections 처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드 - final 클래스와 관련한 메서드들을 모아놓음. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 건 불가능하기 때문이다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 ..
설계와 아키텍처의 차이 -> 없다. - '설계'는 저수준의 구조 또는 결정사항 - '아키텍처'는 저수준의 세부사항과 분리된 고수준의 무언가를 가리킴. - '설계'와 '아키텍처'를 구분 짓는 것는 경계는 모호하다. 고수준에서 저수준으로 향하는 연속적인 의사결정이 있을 뿐.. - 즉, 대상 시스템의 구조를 정의 소프트웨어 아키텍처의 목표 소프트웨어 아키텍처의 목표는 필요한 시스템을 만들고 유지보수하는 데 투입되는 인력을 최소화하는 데 있다. 실례로, 초기 성장 모드에서는 개발자의 생산성이 큰 반면, 일정이상 성장의 상태가 된 후에는 생산성의 증가하지 않는다. 고용하는 개발자는 증가하는데, 생산성에는 변화가 없다. 경영진의 입장에서 보면, 답답할 노릇이다 비용은 증가하고 있는데, 생산성에는 변화가 없으니 말이..
최근 지인들과 사이드프로젝트를 진행하며, 게더타운을 통해 각자의 화면을 공유하며, 불편한 점이 많다는 생각이 들었고 개인적으로 페어프로그래밍 방법에 대해 약간의 조사를 했다. 재미나게도 intellij에는 페어프로그래밍을 할 수 있도록 Code With me 플러그인을 제공하고 있었다. (2021. 2월 버전부터 설치 되어있음.) 2020년 9월부터 오픈한 플러그인(EAP : 얼리 액세스 프로그램)으로 확인되며 공동개발 및 페어 프로그래밍을 지원하는 도구이다. 이 플러그인을 사용하면 JetBrains IDE에서 열린 프로젝트를 다른 사용자와 실시간으로 공유하며 개발 가능하다. 재택근무 시 사용하면 상당히 쓸만한 플러그인 일 수도 있다는 생각이 들어 일단 사용해보았다. - 사용방법 0. 플러그인 설치 맥 ..
AppConifg.java (순수자바로 설정 클래스) public class AppConfig { //memberService는 AppConfig를 통해 불러낸다. //생성자 주입 : 생성자를 통해서 객체를 주입. public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } public OrderService orderService(){ return new OrderServiceImpl(memberRepository(), discountPolicy()); } ..
단방향 통신인 HTTP로 timeout이 걸려 해당 작업을 완료 할 수 없어, web socket을 활용하는 방법에 대해 찾아보고 테스트해 보았다. 웹소켓 객체가 생성되고 메시지를 주고 받는 것까지 확인하였다. pom.xml 수정 ( dependency 추가) 웹소켓 java 추가 ( serverEndpoint에 요청 url 추가 ) import javax.websocket.RemoteEndpoint.Basic; @Controller @ServerEndpoint(value="/echo.do") public class WebSocketChat { @Autowired private DiscountApiController discountApiController; private static final List ..
ildann.tistory.com/5 IntelliJ IDEA에 JUnit 추가하기 / 테스트 코드 작성 IntelliJ IDEA에서 JUnit을 추가하고 테스트 코드를 작성해보자. 아래 코드는 Java의 메서드 오버로딩 예제 코드이다. Main.java public class Main { public static void main(String arg []){ Multiplier multip.. ildann.tistory.com countryxide.tistory.com/17 [JUnit] @RunWith, @ContextConfiguration 그리고 @SpringApplicationConfiguration 스프링 JUnit 테스트를 할 때 테스트 클래스 상단에 @RunWith(SpringJUnit4C..
1. Async 켜기 자바) @configuration @EnableAsync xml) bean 등록 task:excutor 2. Async 어노테이션 달기 상세내용 springboot.tistory.com/38 스프링에서 @Async로 비동기처리하기 스프링에서 @Async로 비동기처리하기 @Async in Spring [원문: http://www.baeldung.com/spring-async] 1. 개요 Overview 이 글에서 스프링의 비동기 실행 지원asynchronous execution support과 @Async annotati.. springboot.tistory.com etc) Spring 비동기 응답 lts0606.tistory.com/7 Spring 비동기 응답(Spring async..
파일 업로드시 절대경로로 저장하고 싶을 때가 있고 상대경로로 저장하고 싶을 때가 있다. 개발 후 서버에 올릴 때 절대 경로가 바뀔 수 있음을 고려했을 때 상대경로로 구현을 하면 두 번 작업을 하지 않을 수 있다. 절대 경로 String path = "C:\\devfunpj"; 상대 경로( 웹서비스 디렉토리 하위 ) String path = request.getSession().getServletContext().getRealPath("/"); ( root 경로) path = rootPath + "createFile" 로 하면 create파일 하위까지 경로가 설정됨. fruitdev.tistory.com/169 [JSP] 서버 물리 경로 구하기 웹 서비스를 개발하다보면 현재 서비스가 돌아가고 있는 서버의 ..