Dockerfile 애플리케이션을 패키징하기 위한 간단한 스크립트다. Dockerfile은 일련의 인스트럭션으로 구성되어있는데, 익스트럭션을 실행한 결과로 도커 이미지가 만들어진다. 어떠한 애플리케이션이라도 패키징할 수 있다. Dockerfile FROM diamol/node ENV TARGET="blog.sixeyed.com" ENV METHOD="HEAD" ENV INTERVAL="3000" WORKDIR /web-ping COPY app.js . CMD ["node", "/web-ping/app.js"] 인스트럭션 설명 예제에서 사용 방법 FROM 모든 이미지는 다른 이미지로부터 출발한다. FROM 뒤에 지정된 이미지를 시작점으로 지정한다. https://hub.docker.com/r/diamol/..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 전략 패턴 (Strategy Pattern) 여러 알고리즘을 캡슐화하고 상호 교환 가능하게 만드는 패턴. 사용할 알고리즘을 클라이언트가 선택한다. 적용 전 코드 (Before) BlueLightRedLight.java public class BlueLightRedLight { private int speed; public BlueLightRedLight(int speed) { this.speed = speed; } public void blueLight() { if (speed == 1) { System.out.println("무 궁 화 꽃 이"); } else if (speed == 2) { System.out.println("무궁화..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 템플릿 콜백 (Template-Callback) 콜백으로 상속 대신 위임을 사용하는 템플릿 패턴. 상속 대신 익명 내부 클래스 또는 람다 표현식을 활용할 수 있다. 적용 전 코드 (Before) FileProcessor.java public class FileProcessor { private String path; public FileProcessor(String path) { this.path = path; } public int process() { try(BufferedReader reader = new BufferedReader(new FileReader(path))) { // 자동 close int result = 0; St..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 템플릿 메서드 (Factory method) 알고리즘 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법. 추상 클래스는 템플릿을 제공하고 하위 클래스는 구체적인 알고리즘을 제공한다. 적용 전 코드 (Before) FileProcessor.java public class FileProcessor { private String path; public FileProcessor(String path) { this.path = path; } public int process() { try(BufferedReader reader = new BufferedReader(new FileReader(path))) { // 자동 close ..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 추상 팩토리 (Abstract Factory) 서로 관련있는 여러 객체를 만들어주는 인터페이스 구체적으로 어떤 클래스의 인스턴스를(concrete product)를 사용하는지 감출 수 있다. 적용 전 코드 (Before) Anchor.java public interface Anchor { } WhiteAnchor.java public class WhiteAnchor implements Anchor { } Wheel.java public interface Wheel { } WhiteWheel.java public class WhiteWheel implements Wheel { } Ship.java @Getter @Setter @ToStr..
수강완료한 강의 복습해보자 (코딩으로 학습하는 GoF의 디자인 패턴) 팩토리 메서드 (Factory Method) 구체적으로 어떤 인스턴스를 만들지는 서브 클래스가 정한다. 다양한 구현체(Product)가 있고, 그중에서 특정한 구현체를 만들 수 있는 다양한 팩토리(Creator)를 제공할 수 있다 적용 전 코드 (Before) Ship.java @Getter @Setter @ToString public class Ship { private String name; private String color; private String logo; } Client.java public class Client { public static void main(String[] args) { Ship whiteship =..
DispatcherServlet 서블릿 컨테이너의 가장 앞단에서 들어오는 모든 요청을 먼저 받아, 적합한 컨트롤러에 위임해주는 프론트 컨트롤러다. dispatch "보내다" 라는 뜻 클라이언트로부터 어떤 요청이 오면, 서블릿 컨테이너가 이 요청을 받게되고, 이 요청을 프론트 컨트롤러인 DispatcherServlet이 받아서 해당 요청을 처리할 컨트롤러(Bean)을 getBean() 메서드로 받아와서 요청에 적합한 컨트롤러의 메서드를 실행시킨다. Spring : web.xml 을 통한 매핑 web.xml Hello_servlet Hello.Hello_servlet // servlet class Hello_servlet /Hello SpringBoot : 자동 구성 SpringBoot는 아래 spring-..
마이바티스(Mybatis) SQL과 자바 객체를 매핑하는 사상에서 개발된 데이터베이스 접근용 프레임워크다. 마이바티스는 SQL 기반으로 데이터베이스 접근을 수행하는 기존 방법을 받아들이고, 규모가 큰 애플리케이션 개발에서 발생하는 과제를 해결하는 구조를 제공한다. Mybatis는 자체 Connection Pool을 가지며, 환경에 따라 사용할 DB를 설정하여 사용한다. 마이바티스 등장 애플리케이션의 규모가 커지면서 SQL이 수백개가 넘는 경우가 많아졌다. SQL 자체의 체계적인 관리 방법이나 SQL의 입출력 데이터와 자바 객체의 효율적인 변환 방법 등 스프링의 기능만으로는 해결할 수 없는 과제가 발생했다. 마이바티스 이점 SQL의 체계적인 관리, 선언적 정의(설정 파일, 어노테이션) 자바 객체와 SQL ..
문제 문자열에서 문자 중복을 제거하여 문자 순서대로 출력한다. 나의 풀이 package com.algorithm._01_그리디_구현; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * @Date 2022/11/21 */ public class LC5_중복문자제거 { static String str; public static void main(String[] args) { // write your code here LC5_중복문자제거 main = new LC5_중복문자제거(); Sys..
1) gradle 설치 brew install gradle 2) pom.xml 경로로 이동 3) gradle init gradle init --type pom 완료된 모습 4) Gradle Build 5) Maven 관련 파일 일괄 삭제 6) 프로젝트 정상 수행 확인
https://github.com/seohaem/kotlin-step1 변수선언 1) var 변수 선언 값 변경이 가능하다. var number1 = 10L 2) val 변수 선언 값 변경이 불가능하다. val number2 = 10L 초기화되지 않은 val 변수는 처음 딱 1번만 값 할당이 가능하다. val number5: Long number5 = 2 print(number5) 3) 타입 선언 Long 타입 변수를 선언해보자. var number3: Long = 10L 선언과 동시에 초기화하는 경우에는 타입 선언은 생략 가능하다. var number3 = 10L 초기화하지 않은 선언은 타입을 넣어줘야한다. var number4: Long number4 = 1 print(number4) 4) Primi..
들어가기전 Redis는 docker를 사용하여 설치한다. https://devfunny.tistory.com/424 docker로 redis 설치 (with docker-compose) Redis 이미지 설치 docker pull redis docker-compose 파일 생성 version: '3.0' services: redis1: image: redis command: redis-server --requirepass root --port 6379 restart: always ports: - 6379:6379 doc.. devfunny.tistory.com redis 의존성 추가 implementation 'org.redisson:redisson-spring-boot-starter:3.17.7' Se..
해당 세미나 강의를 보고 정리 - https://tv.kakao.com/channel/3150758/cliplink/391418995 스프링 웹플럭스 스프링 5.0에 새로 등장한 (새로운) 웹 프레임워크 + 리액티브 스택 SpringMVC 이후 15년만에 처음으로 등장한 신규 웹 프레임워크 초기 이름은 스프링 웹 리액티브였고, 웹플럭스로 명칭이 변경되었다. 스프링 웹플럭스 vs MVC Spring WebFlux - 리액티브 스택 Servlet은 사용 방식은 다르지만 Reactive Stack, Servlet Stack 모두 포함되어있다. JPA(블록킹) 등은 Reactive Stack에는 포함되어있지 않다. Reactor (Reactive Library) 라이브러리 : 웹플럭스의 플럭스는 리액터 라이브러..
애그리거트 간 집합 연관 애그리거트 간 1:N, N:1 연관에 대해 알아보자. 이 두 연관은 컬렉션(Collection)을 이용한 연관이다. 카테고리와 상품 간의 연관이 대표적이다. 카테고리 입장에서 한 카테고리에 한 개 이상의 상품이 속할 수 있으니 카테고리와 상품은 1:N 관계이다. 한 상품이 한 카테고리에만 속할 수 있다면 상품과 카테고리 관계는 N:1 관계이다. 애그리거트 간 1:N 관계는 Set과 같은 컬렉션을 이용해서 표현할 수 있다. 예를 들어 다음 코드처럼 Category가 연관된 Product를 값으로 갖는 컬렉션을 필드로 정의할 수 있다. public class Category { private Set products; // 다른 애그리거트에 대한 1:N 연관 ... } 개념적으로 존재..
리포지토리와 애그리거트 애그리거트는 개념상 완전한 한개의 도메인 모델을 표현하므로 객체의 영속성을 처리하는 리포지터리는 애그리거트 단위로 존재한다. Order와 OrderLine을 물리적으로 각각 별도의 DB 테이블에 저장한다고 해서 Order와 OrderLine을 위한 리포지터리를 각각 만들지 않는다. Order가 애그리거트 루트고 OrderLine은 애그리거트에 속하는 구성요소이므로 Order를 위한 리포지토리만 존재한다. 새로운 애그리거트를 만들면 저장소에 애그리거트를 영속화하고 애그리거트를 사용하려면 저장소에서 애그리거트를 읽어야 하므로, 리포지터리는 보통 다음의 두 메서드를 기본으로 제공한다. 이 두 메서드 외에 필요한 다양한 조건으로 애그리거트를 검색하는 메서드나 애그리거트를 삭제하는 메서드를..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.