0301 - 0307
# 0301 - 0307
# 0301 - Spring boot & Mybatis
# @MapperScan
@MapperScan(basePackages = "co.worker.sponge_scheduler.repository")
# mybatis properties
mybatis.type-aliases-package=co.worker.sponge_scheduler.model
mybatis.mapper-locations=mybatis-mapper/**/*.xml
#mybatis.type-handlers-package=com.example.typehandler
mybatis.configuration.map-underscore-to-camel-case=true
#mybatis.configuration.default-fetch-size=100
#mybatis.configuration.default-statement-timeout=30
# @Mapper
# mapper.xml
- namespace
# 0302 - quartz-scheduler
# ๊ตฌ์กฐ
# Job
Quartz API์์ ๋จ ํ๋์ ๋ฉ์๋ execute(JobExecutionContext context)๋ฅผ ๊ฐ์ง Job ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. Quartz๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ์ํํด์ผ ํ๋ ์ค์ ์์ ์ ์ด ๋ฉ์๋์์ ๊ตฌํํ๋ฉด ๋๋ค.
# JobDetail
Job์ ์คํ์ํค๊ธฐ ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด์ด๋ค. Job์ ์ด๋ฆ, ๊ทธ๋ฃน, JobDataMap ์์ฑ ๋ฑ์ ์ง์ ํ ์ ์๋ค. Trigger๊ฐ Job์ ์ํํ ๋ ์ด์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ผ์ค๋ง์ ํ๋ค.
# JobDataMap
JobDataMap์ Job ์ธ์คํด์ค๊ฐ execute ์คํํ ๋ ์ฌ์ฉํ ์ ์๊ฒ ์ํ๋ ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ ๊ฐ์ฒด์ด๋ค. JobDetail์ ์์ฑํ ๋ JobDataMap๋ ๊ฐ์ด ์ธํ ํด์ฃผ๋ฉด ๋๋ค.
# Trigger
Trigger๋ Job์ ์คํ์ํฌ ์ค์ผ์ค๋ง ์กฐ๊ฑด(ex. ๋ฐ๋ณต ํ์, ์์์๊ฐ) ๋ฑ์ ๋ด๊ณ ์๊ณ Scheduler๋ ์ด ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Job์ ์ํ์ํจ๋ค. N Trigger = 1 Job ๋ฐ๋์ ํ๋์ Trigger๋ ๋ฐ๋์ ํ๋์ Job์ ์ง์ ํ ์ ์๋ค. SimpleTrigger - ํน์ ์๊ฐ์ Job์ ์ํํ ๋ ์ฌ์ฉ๋๋ฉฐ ๋ฐ๋ณต ํ์์ ์คํ ๊ฐ๊ฒฉ๋ฑ์ ์ง์ ํ ์ ์๋ค CronTrigger - CronTrigger๋ cron ํํ์์ผ๋ก Trigger๋ฅผ ์ ์ ํ๋ ๋ฐฉ์์ด๋ค.
# 0303 - arrow function expression
# ์ผ๋ฐ ํจ์์ ์ฐจ์ด์
- this๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
- arguments๋ฅผ ์ง์ํ์ง ์๋๋ค.
- new์ ํจ๊ป ํธ์ถํ ์ ์๋ค.
- super๋ฅผ ์ง์ํ์ง ์๋๋ค.
# 0304 - Cookie vs WebStorage
# Cookie
- ํน์ง
- ์น ์์ฒญ์ ์ฟ ํค ์ ๋ณด๋ฅผ ํฌํจํ์ฌ ์๋ฒ์ ์ ์ก
- ๊ฐ์์ ์ฉ๋์ ์ ํ
- ์ ํจ๊ธฐ๊ฐ
- ์ฅ์
- ์ฅ์ : ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์ง์
- ๋จ์ : api๊ฐ ํ๋ฒ ๋ ํธ์ถ - ์๋ฒ์ ๋ถ๋ด
# WebStorage
- ํน์ง
- ์ ์ฅ ๋ฐ์ดํฐ๊ฐ ํด๋ผ์ด์ธํธ์๋ง ์กด์ฌ - ์๋ฒ๋ก ์ ์กํ์ง ์๋๋ค.
- ์ฉ๋์ ์ ํ์ด ์๋ค
- ์ ์ฅํ ๋ฐ์ดํฐ๋ ์๊ตฌ์ ์ผ๋ก ์กด์ฌ
- ๋๋ฉ์ธ์ ๊ธฐ์ค
- HTML4๋ง ์ง์๋๋ ๋ธ๋ผ์ฐ์ ์๋ ์ง์์ด ์๋จ
- LocalStorage
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํด๋ ๋ฐ์ดํฐ๋ ๋ณด๊ด
localStorage.setItem("key", "value");
localStorage.getItem("key");
localStorage.removeItem("key");
localStorage.clear();
- SessionStorage
- ์ธ์ ์ข ๋ฃ์ ์ ๋ณด ์ญ์ (๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์๊ฒฝ์ฐ)
sessionStorage.setItem("key", "value");
sessionStorage.getItem("key");
sessionStorage.removeItem("key");
sessionStorage.clear();
# 0305 - OS๋ณ ํฌํธ. ํ๋ก์ธ์ค ํ์ธ
# mac
- ํฌํธ ํ์ธ
lsof -i : {port}
- ํ๋ก์ธ์ค ํ์ธ
ps -ef | grep
- ํ๋ก์ธ์ค ์ข
๋ฃ
kill -9 {PID}
# window
- ํฌํธ ํ์ธ
netstat -ano | findstr {port}
- ํ๋ก์ธ์ค ์ข
๋ฃ
taskkill /f /pid {PID}
# linux
- ํฌํธ ํ์ธ
netstat -tnlp | grep {port}
- ํ๋ก์ธ์ค ํ์ธ
ps -ef | grep
- ํ๋ก์ธ์ค ์ข
๋ฃ
kill -9 {PID}
# 0306 - enum
# ์ฌ์ฉ๋ชฉ์
- ์์๋ฅผ ํํํ๊ธฐ์ ์ฝ๋๊ฐ ๋จ์ํด์ง๋ฉฐ ๊ฐ๋ ์ฑ์ด ์ข๋ค.
- ์ธ์คํด์ค ์์ฑ๊ณผ ์์์ ๋ฐฉ์ง.
- ํค์๋ enum์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ์๋๊ฐ ์ด๊ฑฐ์์ ๋ถ๋ช ํ๊ฒ ๋ํ๋ผ ์ ์์.
# enum ํน์ง
- enum์ ๊ฒฝ์ฐ ๋ํดํธ ์์ฑ์์ ์ ๊ทผ ์ ์ด์๊ฐ private, ์ปดํ์ผํ์์ ๋ชจ๋ ๊ฐ์ ์๊ณ ์์ด์ผ ํ๋ฉฐ ๋์ ์ผ๋ก ๊ฐ์ ํ ๋น ํด์ ์๋จ.
# ๋ฉ์๋
- values() ๋ชจ๋ ์์ ๋ฐํ
- ordinal() ์์ ์ธ๋ฑ์ค ๋ฐํ
- valueOf() ์์ ๋ฌธ์ ๊ฐ ๋ฐํ
# ์์
public enum Winner {
WINNER("์น๋ฆฌ", Arrays.asList("kyle","pobi","hello","world")),
LOSER("ํจ๋ฐฐ", Arrays.asList("hodol","dunddoung","rutgo");
private final String winner;
private final List<String> list;
Winner(String winner, List<String> list) {
this.winner = winner;
this.list = list;
}
}
public enum Statistic {
THREE(3, 5000),
FOUR(4, 50_000),
FIVE(5, 1_500_000),
BONUS(5, 3_000_000),
SIX(6, 2_000_000_000);
private final int matchingNumbers;
private final int prize;
Statistic(int matchingNumbers, int prize) {
this.matchingNumbers = matchingNumbers;
this.prize = prize;
}
public static Statistic getRank(int numberOfMatch) {
return Arrays.stream(values())
.filter(statistic -> statistic.matchingNumbers == numberOfMatch)
.findFirst()
.orElseThrow(new IllegalArgumentException("์ผ์นํ๋ ๋ฒํธ๊ฐ 3๋ฏธ๋ง์
๋๋ค."))
}
import java.util.function.BiFunction;
public enum Operator {
PLUS("๋ํ๊ธฐ", (a, b) -> (a + b)),
MINUS("๋นผ๊ธฐ", (a, b) -> (a - b)),
MULTIPLY("๊ณฑํ๊ธฐ", (a, b) -> (a * b)),
DIVIDE("๋๋๊ธฐ", (a, b) -> (a / b));
private final String name;
private final BiFunction<Double, Double, Double> biFunction;
Operator(String name, BiFunction<Double, Double, Double> biFunction) {
this.name = name;
this.biFunction = biFunction;
}
public Double calculate(double a, double b) {
return this.biFunction.apply(a,b);
}
}
# 0307 - Builder
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ํจํด์ค ํ๋
# ๊ฐ์ฒด ์์ฑ ํจํด
- ์ ์ธต์ ์์ฑ์ ํจํด > ๊ฐ๋ ์ฑ ๋ฐ ์ธ์์ ์๋งํผ ์์ฑ์ ์ซ์๊ฐ ๋ง์์ง
- ์๋ฐ๋น ํจํด > setter ๋ฉ์๋ ์ฌ์ฉ์ผ๋ก ๊ฐ์ฒด ์ผ๊ด์ฑ์ด ๋ถํ์ค
- ๋น๋ ํจํด
# ์์
// Effective Java์ Builder Pattern
public class NutritionFacts {
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 static class Builder {
// Required parameters(ํ์ ์ธ์)
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values(์ ํ์ ์ธ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ)
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;
public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}
public Builder calories(int val) {
calories = val;
return this; // ์ด๋ ๊ฒ ํ๋ฉด . ์ผ๋ก ์ฒด์ธ์ ์ด์ด๊ฐ ์ ์๋ค.
}
public Builder fat(int val) {
fat = val;
return this;
}
public Builder carbohydrate(int val) {
carbohydrate = val;
return this;
}
public Builder sodium(int val) {
sodium = val;
return this;
}
public NutritionFacts build() {
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}
NutritionFacts facts = NutritionFacts.builder()
.calories(230)
.fat(10)
.build();
# lombok ์ฌ์ฉ
- @Builder
- ํด๋์ค ์ ์ ์ธ๋ณด๋ค๋ ์ฌ์ฉํ๊ณ ์ํ๋ ์์ฑ์ ์์ ์ ์ธ