목록Programming (14)
공부기록
ITEM 2 : 생성자에 매개변수가 많다면 빌더를 고려하라 객체의 생성자 패턴에는 먼저 점층적 생성자 패턴, 자바빈즈 패턴이 있었다. 먼저 점층적 생성자 패턴이다. 생성자를 필수 매개변수를 받는 생성자부터 시작해서 선택 매개변수 1개 ... N개 까지 생성자를 늘려가는 식이다. class Example1{ private final int a; private final int b; private final int c; public Example(int a){ this(a,0,0); } public Example(int a, int b){ this(a,b,0); } public Example(int a, int b, int c){ this.a = a; this.b = b; this.c = c; } } 이 패..
ITEM 1. 생성자 대신 정적 팩터리 메서드를 고려하라 정적 팩터리메서드는 그 클래스의 인스턴스를 반환하는 정적 메서드이다. 다음은 Boolean클래스에서 발췌한 간단한 예시이다. 이 메서드는 기본 타입인 boolean 값을 받아 Boolean 객체 참조로 반환한다. public static void valueOf(boolean b){ return b? Boolean.TURE : Boolean.FALSE; } 이런 방식에는 장점 5가지가 있다. 이름을 가질 수 있다. 생성자는 반환될 객체의 특징을 설명할 수 없지만, 정적 팩터리 메서드는 반환될 객체의 특징을 설명할 수 있다. 호출될 때 마다. 인스턴스를 새로 생성하지는 않아도 된다. 위의 예시와 같이 인스턴스를 미리 만들어 재사용할 수 있다. 반환 타..
block vs nonblock, sync vs async 사실 이들을 논하기 전에 우리는 블락과 논블락, 동기와 비동기가 다른 영역의 개념이라는 것을 깨달아야 한다. 시스템 콜의 측면에서 block은, 시스템 콜을 호출한 쓰레드가 대기 큐에 들어가게 되고, 시스템 콜이 끝나면 다시 실행대기 큐로 들어가게 되는 것을 말한다. 다시 실행을 재개하면, 그 쓰레드는 요청한 시스템 콜로부터의 결과값을 리턴받게 된다. non-block은 반대로, block하지 않는다는 것이다. 쓰레드를 대기큐에 넣지 않으며, 시스템 콜은 호출되고서 바로 결과값을 리턴하게 된다. synchronous 하다는 것은 시스템 콜을 호출했을 때, 호출 한 그 자리에서 호출한 쓰레드가 멈춰서 리턴 값을 기다린다는 것이다. asynchron..
쓰레드의 동기화 쓰레드간의 상호배제를 지키기 위해, 임계영역에 하나의 쓰레드만 들어오도록 락을 걸 수 있다. 이 처럼 한 스레드가 진행 중인 작업을 다른 쓰레드가 간섭하지 못하도록 막는 것을 '스레드의 동기화 (synchronization)' 이라고 한다. synchronized를 이용한 동기화 synchronized 키워드를 이용한 동기화에는 두 가지 방식이 있다. 메서드 전체를 임계영역으로 지정 public synchronized void calcSum(){ /* 모두 임계 영역이 된다.*/ } 이 경우, 해당 메서드가 포함된 객체의 lock을 얻어 작업을 수행하다가 메서드가 종료되면 lock을 반환한다. 특정한 영역을 임계영역으로 지정 synchronized(refObj){ /* 모두..
프로세스의 구현과 실행 public class ThreadEx1 { public static void main(String[] args){ ThreadEx1_1 t1 = new ThreadEx1_1(); Runnable r = new ThreadEx1_2(); Thread t2 = new Thread(r); t1.start(); t2.start(); } } class ThreadEx1_1 extends Thread{ public void run(){ for(int i=0; i
SOLID 원칙이 필요한 이유 SOLID 원칙은 객체지향 프로그래밍을 하면서 모듈간의 잘못된 의존성을 줄이기 위해서 필요하다. 처음에 프로그램을 설계할 때 자신만의 구조가 있을 것이다. 하지만 이 프로그램이 변경되면서 처음의 구조가 무너지면서 점차 잘못된 의존성이 생겨나게 된다. 이 잘못된 의존성 에 의해 나타나는 4가지 문제는 다음과 같다. Rigidity Rigitiy(이하 경직성)은 프로그램이 변경되기 어려워지는 것을 말한다. 모듈간의 결합도가 강해지면서, 한 모듈을 수정하면 다른 모듈을 수정하고, 그 수정에 의해 또 다른 모듈의 수정이 필요해지면서 점차 프로그램을 변경하는데 너무 많은 공수가 필요하게 된다. Fragility Fragility(이하 취약성)은 프로그램이 변경될 때마다 그 변경이 프..
Thymeleaf 마크업을 깨지않는 문법 브라우저로 바로 열기가능 스프링이 지원함 (Spring native) 문법이 문서를 많이 봐야됨 ㅜㅜ 템플릿 경로가 설정이 되어있어 해당 경로에 템플릿을 작성하면 알아서 로딩됨 resources/templates/${템플릿 이름}이 기본값 이 부분은 설정파일의 설정값을 바꾸면 된다. spring-boot-devtools를 import하면 템플릿을 수정후 서버만 recompile하면 템플릿 변경사항이 반영됨. H2 Database 개발, 테스트용 DB 웹화면을 제공 세팅방법 h2 database 설치 설정을 Generic H2 (Server)로 설정 jdbc:h2:~/jpashop 으로 접속해서 C:/USER/SUA 폴더에 jpashop.mv.db를 생성, 이후에 ..
MVC? Model View Controller (MVC) 디자인 패턴은 어플리케이션이 model, presentation information, control information으로 구성되는 것을 명시한다. 이 패턴은 이 것들이 서로 다른 객체로 나누어지는 것을 필요로 한다. MVC는 완전한 어플리케이션이 아닌 구조적인 패턴에 더 가깝다. MVC는 대개 어플리케이션의 UI / 상호작용 계층에 더 관련된다. 당신은 여전히 비지니스 로직계층과, 서비스 계층, 그리고 데이터 엑세스 계층이 필요할 것이다. 위 그림의 각 구성요소의 특성은 아래와 같다. Model Model은 오직 어플리케이션 데이터, 비지니스 로직을 포함하며, 어떻게 유저에게 정보를 제공할 지에 대한 정보를 전혀 가지지 않는다. 웹 어플리케..