0906 - 0919
# 0906 - 0919
# 0907 - Static, Stack, Heap / Java ๋ฉ๋ชจ๋ฆฌ ์์ญ
ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ํ๊ธฐ ์ํด์๋ ์ด์์ฒด์ ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ๋ฐ ๋ช ๋ น์ ์ ์ฅํ ๊ณต๊ฐ์ ํ ๋นํด์ผํจ.
๋ฉ๋ชจ๋ฆฌ๋ CPU๊ฐ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๊ฐ ์์๋ก ์ ์ฅ๋๋ ๊ณต๊ฐ. ๋์์ ํ๋๋์คํฌ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์ ์คํ๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ ๊ธฐ์ต ์ฅ์น๋ผ๊ณ ๋ถ๋ฆ
=> ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉ ๊ณต๊ฐ์ด ํ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌ๋์ด์ผํจ.
# Static Area (์คํํฑ ๋ฉ๋ชจ๋ฆฌ ์์ญ)
- static(์ ์ )์ ๊ณ ์ ๋ ์ด๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. static ์ด๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ๋์ ์ ์ ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋๋ฐ, ๋ ๊ฐ์ง๋ฅผ ํฉ์ณ์ ์ ์ ๋ฉค๋ฒ๋ผ๊ณ ํ๋ค.(= ํด๋์ค ๋ฉค๋ฒ)
- Static Area(์คํํฑ ๋ฉ๋ชจ๋ฆฌ ์์ญ)์์๋ ํ๋ ๋ถ๋ถ์ ์ ์ธ๋ ๋ณ์(์ ์ญ ๋ฒฝ์)์ ์ ์ ๋ฉค๋ฒ ๋ณ์(static์ด ๋ถ์ ์๋ฃํ)์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
- Static Area(์คํํฑ ๋ฉ๋ชจ๋ฆฌ ์์ญ)์ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ์ ์์๋ถํฐ ์ข ๋ฃ๊ฐ ๋ ๋๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ฒ ๋๋ค. ์ฆ, ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ ๋๊ฐ์ง ์ด๋์๋ ์ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ์ฃผ์ํ ์ ์ ์ ์ญ ๋ณ์๋ฅผ ๋ฌด๋ถ๋ณํ๊ฒ ๋ง์ด ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
*** ๊ฐ์ฒด์ ์์๋ ๋ฉค๋ฒ๊ฐ ์๋ ํด๋์ค์ ๊ณ ์ ๋ ๋ฉค๋ฒ
# Stack Area (์คํ ๋ฉ๋ชจ๋ฆฌ ์์ญ)
- ๋ฉ์๋ ๋ด์์ ์ ์ํ๋ ๊ธฐ๋ณธ ์๋ฃํ์ ํด๋น๋๋ ์ง์ญ๋ณ์์ ๋ฐ์ดํฐ ๊ฐ์ด ์ ์ฅ๋๋ ๊ณต๊ฐ์ด Stack Area์ด๋ค. ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๊ณ , ์ข ๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง๋ค.
- ์ฐธ์กฐํ ํ์ ๋ณ์๋ ์ฐธ์กฐ๊ฐ๋ง ์ ์ฅ๋๋ค. ์ด ์ฐธ์กฐ๊ฐ์ Heap ์์ญ์ ์กด์ฌํ๋ ์ธ์คํด์ค(๊ฐ์ฒด)๋ฅผ ๊ฐ๋ฅดํค๋ ์ญํ ์ ํ๋ค.(์ธ์คํด์ค์ ์ฃผ์ ๊ฐ)
*** ๋ฉ์๋ ๋ด์์ ์ ์ํ๋ ๊ธฐ๋ณธ ์๋ฃํ
- ํ๋ก์ธ์ค๋ ์๋ฒฝํ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ณต์ ํ์ง ์์ง๋ง, ์ค๋ ๋๋ ํ๋ก์ธ์ค ์์์ ํด๋น ์ค๋ ๋๋ฅผ ์ํ Stack์์ญ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ค๋ ๋์์ ๋ค๋ฅธ ์ค๋ ๋๋ก์ ์ ๊ทผ์ ๋ถ๊ฐ๋ฅํ์ง๋ง static, heap ์์ญ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋ค.
# Heap Area (ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ)
- ์ฐธ์กฐํ(Reference Type)์ ๋ฐ์ดํฐ ํ์ ์ ๊ฐ๋ ๊ฐ์ฒด, ๋ฐฐ์ด ๋ฑ์ Heap ์์ญ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- ์ด๋ ๋ณ์(๊ฐ์ฒด, ๊ฐ์ฒด ๋ณ์, ์ฐธ์กฐ ๋ณ์)๋ Stack ์์ญ์ ๊ณต๊ฐ์์ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ Heap ์์ญ์ ์ฐธ์กฐ๊ฐ(Reference key, ํด์ ์ฝ๋ = ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์ฃผ์๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๊ฐ)์ new ์ฐ์ฐ์๋ฅผ ํตํด์ ๋ฆฌํด ๋ฐ๋๋ค.
- ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ Heap ์์ญ์ ์ฃผ์ ๊ฐ์ Stack ์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ๊ณ ์๋ ๊ฒ
- ์ด๋ ๊ฒ ๋ฆฌํด ๋ฐ์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ํตํด์๋ง ํด๋น ์ธ์คํด์ค๋ฅผ ์ปจํธ๋กค ํ ์ ์๋ค.
- ์ธ์คํด์ค์ ์ค์ ๋ฐ์ดํฐ๋ Heap ์์ญ์ ์ฌ๋ผ๊ฐ๋ค. ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์์น๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ static ๋ฉ์๋์์ ์ธ๋ถ ์ธ์คํด์ค ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
*** Heap์ ์ฐธ์กฐํ์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ์ค์ ๋ฐ์ดํฐ๋ค์ด ๋ด๊ธฐ๋ ๊ณต๊ฐ์ด๊ณ , ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ Heap ์์ญ์ ์ฐธ์กฐ๊ฐ์ Stack ์์ญ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฒ
*** new๋ฅผ ํตํด ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ์ ๋, heap ์์ญ์๋ ์์ฑ๋ ๊ฐ์ฒด๊ฐ ์ฌ๋ผ๊ฐ๊ณ , Stack ์์ญ์๋ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฃผ์ ๊ฐ(Reference)์ด ์ ์ฅ
*** ์ด๋ค ์ฐธ์กฐ ๋ณ์๋ Heap ์์ญ์ ์๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ง ์๊ฒ ๋๋ค๋ฉด, GC์ ์ํด ๋ฉ๋ชจ๋ฆฌ์์ ์ฌ๋ผ์ง๋ค.
# 0909 - jacoco
# JaCoCo
Java code coverage์ ์ฝ์๋ก jUnit ํ ์คํธ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ์ปค๋ฒ๋ฆฌ์ง์ ํด
์ฝ๋์ ์ ๋ถ์๋๊ตฌ์ธ sonarqube์ ์ฐ๊ณํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
# JaCoCo ํน์ง
- Line, Branch Coverage๋ฅผ ์ ๊ณตํ๋ค.
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ข๋๋ก ํ์ผ ํํ๋ก ์ ์ฅํ ์ ์๋ค.
- html, xml, csv ๋ฑ์ผ๋ก Report๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ค์ ํ ์ปค๋ฒ๋ฆฌ์ง ๊ธฐ์ค์ ๋ง์กฑํ๋์ง ํ์ธํ ์ ์๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ฝ๊ฒ ํ์ธํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค.
# JaCoCo Maven ์์
# jacoco ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
# JacocoController.java
package com.example.jacocotest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class JacocoController {
@GetMapping("/test")
public String test(@RequestParam int n) {
if (n >= 0) {
return "hello";
} else {
return "world";
}
}
}
# JacocoControllerTest.java
package com.example.jacocotest;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
@SpringBootTest
@AutoConfigureMockMvc
public class JacocoControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void test() throws Exception {
mvc.perform(get("/test").param("n", "3")).andExpect(content().string("hello")).andExpect(status().isOk());
}
}
# mvn package
- mvn package ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
maven์ ๋ผ์ดํ์ฌ์ดํด์ phase๋
validate -> compile -> test -> package -> install -> deploy
test ์ดํ package๋ฅผ ํ ๋ Jacoco๊ฐ ํ์ฝํ๋ฏ๋ก package๊น์ง๋ง ์ ๋ ฅ์์๋ Jacoco๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
# ํน์ ์ผ์ด์ค ์ ์ธ
- plugin์ configuration์ผ๋ก ์ ์ธ
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<configuration>
<excludes>
<exclude>**/*Application.class</exclude>
</excludes>
</configuration>
<executions>
...
</executions>
</plugin>
# 0910 - SSR, CSR
# SSR(Server Side Rendering)
ํ์ด์ง ์์ฒญ์ ์๋ฒ์์ ๋ ๋๋ง์ ๋ง์น๊ณ , data๊ฐ ๊ฒฐํฉ๋ htmlํ์ผ์ ๋ณด๋ด๋ ๋ฐฉ์.
- ์ฅ์
- CSR์ ๋นํด ๋ค์ด ๋ฐ๋ ํ์ด์ง ๋ฆฌ์์ค๊ฐ ์ ์ด ์ด๊ธฐ ๋ก๋ฉ์๋๊ฐ ๋น๊ต์ ๋น ๋ฅด๋ค.
- HTML์ ๋ํ ์ ๋ณด๊ฐ ์ฒ์๋ถํฐ ํฌํจ๋์ด ์์ด ๋ชจ๋ ๊ฒ์์์ง์ ๋ํ SEO(๊ฒ์ ์์ง ์ต์ ํ)๊ฐ ๊ฐ๋ฅํ๋ค.
- ๋จ์
- ๋งค๋ฒ ํ์ด์ง๋ฅผ ์์ฒญํ ๋๋ง๋ค ํ๋ฉด ๊น๋นก์์ด ๋ฐ์ํ๋ค.
- ํ์ด์ง ์ด๋์ ์๋ฒ์ ๋งค๋ฒ ์์ฒญ์ ํ๊ธฐ ๋๋ฌธ์, ์๋ฒ ๋ถํ๊ฐ ์ปค์ง๋ค.
# CSR(Client Side Rendering)
์ต์ด ๋ก๋ฉ ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์ html์ ๋น๋กฏํ css, javascript ๋ฑ ๊ฐ์ข ๋ฆฌ์์ค๋ค์ ๋ฐ์์ค๋ ๋ฐฉ์์ด ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง ๋ฐฉ์์ด๋ค.
- ์ฅ์
- ์ด๊ธฐ ์์ฒญ์ ์ ์ธํ๊ณ ๋ SSR์ ๋นํด ๋น ๋ฅธ ํ์ด์ง ์ ํ ์๋์ ๊น๋นก์ ์๋ UX๋ฅผ ์ ๊ณตํ๋ค.
- ์๋ฒ์ ์์ฒญํ๋ ํ์๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ์๋ฒ ๋ถ๋ด์ด SSR์ ๋นํด ์ ๋ค.
- ๋จ์
- ์ต์ด ๋ก๋ฉ ์ ๋ชจ๋ ๋ฆฌ์์ค๋ค์ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๋ค.
- ์ฒ์์๋ HTML์ด ๋น์ด ์์ด ํฌ๋กค๋ฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์งํ ์ ์๊ธฐ ๋๋ฌธ์ SEO ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ฟ ํค๋ localStorage์์ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ XSS ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ค.
# 0911 - Docker Redis ์ค์น
# ๋์ปค๋ก ๋ ๋์ค ์ค์น
- ๋ ๋์ค ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
$ docker pull redis
- ์ด๋ฏธ์ง ํ์ธ
$ docker images
- ๋ ๋์ค ์๋ฒ ์คํ
$ docker run --name ์ปจํ
์ด๋์ด๋ฆ -d -p 6379:6379 rdis
- Docker์ redis-cli๋ก ์ ์ํ๊ธฐ
$ docker run -it --link ์ปจํ
์ด๋์ด๋ฆ:redis --rm redis redis-cli -h redis -p 6379
- Shell๋ก Docker ๋ฆฌ๋ ์ค์ ์ ์ํ๊ธฐ
$ docker ps
$ docker exec -it ์ปจํ
์ด๋์ด๋ฆ /bin/bash
- ๋์ปค์ฉ redis.conf
daemonize no
# bind 127.0.0.1
protected-mode no
port 6001
logfile "redis.log"
dir /data
- redis.conf ํ์ผ ์ง์ ํด์ ์คํ: volume ์ง์
$ docker run -v /root/docker/redis-5.0.3/6001:/data --name myredis -d -p 6001:6001 redis redis-server /data/redis.conf
# 0918 - docker(๋์ปค) ์ด๋ก
# ๋์ปค๋?
๋์ปค๋, ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์คํ์์ค ๊ฐ์ํ ํ๋ซํผ์ด๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ๊ฒ ๊ตฌ์ถ, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ ์ ์๋ ์ํํธ์จ์ด ํ๋ซํผ
- ๋์ปค๋ ์ํํธ์จ์ด๋ฅผ ์ปจํ ์ด๋๋ผ๋ ํ์คํ ๋ ์ ๋์ผ๋ก ํจํค์งํ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์์คํ ๋๊ตฌ, ์ฝ๋, ๋ฐํ์ ๋ฑ ์ํํธ์จ์ด๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ด ํฌํจ
- ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ค.
# ์ปจํ ์ด๋
- ์ปจํ ์ด๋ ๊ธฐ์ ์ ํธ์คํธOS๋ฅผ ๊ณต์ ํ๋ฉฐ, ์ฌ๋ฌ๊ฐ์ ์ปจํ ์ด๋๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด ๊ฐ๋ณ๋ค.
- VM๊ณผ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ํ๋ก์ธ์ค๋ฅผ ๊ฒฉ๋ฆฌ ํ๋ ๊ฒ์ด๋ค. VM์ ๊ฐ์๋จธ์ ๋ค ์ฌ์ด์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ๋ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ฉด, ์ปจํ ์ด๋ ๊ธฐ์ ์ ๋ ๋ฆฝ์ ์ผ๋ก, ํธ์คํธOS์ ์์์ ๊ณต์ ํ๋ฉฐ ๊ฐ๊ฐ ํ์ํ ์์๋ค์ ํ ๋น๋ฐ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์ ๋ค. **์ค๋ฒํค๋ : ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ๋ค์ด๊ฐ๋ ๊ฐ์ ์ ์ธ ์ฒ๋ฆฌ ์๊ฐ ๋ฐ ๋ฉ๋ชจ๋ฆฌ
# ์ปจํ ์ด๋ ์์ฑ
์ปจํ
์ด๋์ ์์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปคํ์ผ
์ด๋ผ๋ ๊ฒ์ ์ด์ฉํ๋ค.
๊ฐ์ํ ํ ํ๋ก๊ทธ๋จ๋ค์ '๋์ปคํ์ผ'์ด๋ DSL(Domain Specific Laguage)ํํ๋ก ์์ฑํ๋ค.
- ์ปจํ ์ด๋์ ์์ฑ๊ณผ์
๋์ปคํ์ผ -> (build) = ๋์ปค์ด๋ฏธ์ง ์์ฑ
๋์ปค์ด๋ฏธ์ง -> (run) = ๋์ปค์ปจํ
์ด๋ ์์ฑ