0822 ~ 0911
# 0822 ~ 0911
# 0823 - ELK
# ELK๋?
ELK๋ Elasticsearch, Logstash, Kibana์ ์๊ธ์๋ฅผ ๋ฐ์์ ๋ง๋ ์ฝ์ด์ด๋ค.
- Elasticsearch๋ ๊ฒ์ ๋ฐ ๋ถ์ ์์ง
- Logstash๋ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ๋ณํ ํ Elastic search๊ฐ์ ์๋ฒ๋ก ์ ์กํ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
- Kibana๋ ์ฌ์ฉ์๊ฐ ์์งํ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ๋ณผ ์ ์๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ์์งํด ์๊ฐํ ํ๋ ์คํ์์ค
ELK๋ ์คํ์์ค๋ก, ๋ฌด๋ฃ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
ํด๋ผ์ฐ๋ ๊ฐ์ด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ์๋ฒ๋ ๋ก๊ทธ๊ฐ ๋ง์ ๋ถ์ํ๋๋ฐ ์ด๋ ค์์ด ์กด์ฌํ๋๋ฐ, ๋ก๊ทธ ํ์ผ์ ์ฉ๋์ด ์ปค์ ธ ๋์คํฌ ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋, ํน์ ๋ก๊ทธ๋ฅผ ๊ฒ์ํ๊ธฐ์ ๋๋ฌด ๋ฐ์ดํฐ๊ฐ ๋ง์ ์ฐพ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์ด ์๋ค.
๊ทธ๋์ ELK๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ ๋ถ์ ๋ฐ ๊ฒ์์ ํจ์จ์ ์ผ๋ก ํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค. ใ
์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์์ง์ ํ๋ Filebeat๊ฐ ์ถ๊ฐ๋๋ฉด์ ELK Stack์ผ๋ก ๋ถ๋ฆฌ๊ฒ ๋์๋ค.
# ELK Stack
# 1. Elastic search
- Apache Lucene ๊ธฐ๋ฐ์ Java ์คํ์์ค ๋ถ์ฐ ๊ฒ์์์ง.
- Elasticsearch๋ Logstash๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ๋ฐ ๋ถ์ํ์ฌ ํ์ํ ์ ๋ณด๋ฅผ ์ป์์ ์๋ค.
- ์ผ๋ง๋ ๋น ๋ฅด๋๋ฉด 10๋ ์น ๋ฐ์ดํฐ๋ฅผ OracleDB์์ ๊ฒ์ํ๋ฉด 1๋ฌ์ ๋ ๊ธฐ๋ค๋ ค์ผ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋๋ฐ, Elasticsearch๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋จ ๋ช๋ถ๋ง์ ๋์ฌ ์ ์๋ค.
# 2. Logstash
- scv, DB ๋ฑ ๋ค์ํ ์์ค์์ ๋ก๊ทธ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ์์ง, ์ง๊ณ, ํ์ฑํ์ฌ Elasticsearch๋ก ์ ๋ฌ.
- ์๋ฒ์ธก ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ ๋ผ์ธ์ผ๋ก ๋ฐ์ดํฐ ์์ง ์์ง์ด๋ค.
# 3. Kibana
- Elasticsearch์ ํจ๊ป ๋์ํ๋๋ก ์ค๊ผ๋ ์คํ์์ค ๋ถ์ ๋ฐ ์๊ฐํ ํ๋ซํผ.
- ํ์คํ ๊ทธ๋จ, ์ ํ ๊ทธ๋ํ, ์ํ ์ฐจํธ ๋ฑ ๋ค์ํ ์ฐจํธ ๋ฐ ๋ถ์์ ๋ํด ์๊ฐํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณต.
# 4. Filebeat
- ์๋ฒ์ ์์ด์ ํธ๋ก ์ค์นํ์ฌ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ Elasticsearch ๋๋ Logstash์ ์ ์กํ๋ ๋ฐ์ดํฐ ์ ๋ฌ์์ด๋ค.
- Filebeat์๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ inputs๋ฅผ ๊ฐ์ง๋๋ฐ, ์ฌ๊ธฐ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ์์งํ์ฌ ์ ์ก.
# 0829 - MockMvc vs Restassured
# MockMvc
# ์ฌ์ฉ๋ชฉ์
MockMvc๋ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ฐฐํฌํ์ง ์๊ณ ๋ ์คํ๋ง MVC์ ๋์์ ์ฌํํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ ๋๋ถ๋ถ Controller Layer Unit Test(๋จ์ ํ ์คํธ)์ ์ฌ์ฉ๋๋ค.
์ค์ ์๋ฒ ํ๊ฒฝ๊ณผ ๋์ผํ @SpringBootTest๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ผ๋ฏ๋ก @WebMvcTest๋ฅผ ํตํด Presentation Layer Bean๋ค๋ง ๋ถ๋ก์จ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ Bean์ Mock ๊ฐ์ฒด ์ค์ ์ ํด์ฃผ์ด ์์ํ Controller ๋ก์ง์ ํ ์คํธํ๋ค.
# ์์กด์ฑ
MockMvc๋ Spring Framework Test ํด๋์ค ์ค ํ๋๋ค. ์ฆ Spring test ์์กด์ฑ์ด ์ถ๊ฐ๋์ด์๋ ๊ฒฝ์ฐ ๋ณ๋์ ์์กด์ฑ ์ถ๊ฐ๋ฅผ ํ์ง ์์๋ ์ฌ์ฉํ ์ ์๋ค.
# ์๋
MockMvc๋ ๋ณ๋์ ๊ตฌ์ฑ์์ด๋ @WebMvcTest๋ก ํ ์คํธ๋ฅผ ์ํํ ์ ์๋ค. ๋ฌผ๋ก @SpringBootTest๋ก๋ ์ํํ ์ ์๋ค. MockMvc๋ฅผ @WebMvcTest๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
@WebMvcTest
@AutoConfigureMockMvc
public class ApiTest {
@Autowired
private MockMvc mockMvc;
...
}
# ๊ฐ๋ ์ฑ
@Test
public void getMember() throws Exception {
mockMvc.perform(get("/members/1")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.id", Matchers.is(1)))
}
# RestAssured
# ์ฌ์ฉ๋ชฉ์
RestAssured๋ REST ์น ์๋น์ค๋ฅผ ๊ฒ์ฆํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ ๋๋ถ๋ถ End-to-End Test(์ ๊ตฌ๊ฐ ํ ์คํธ)์ ์ฌ์ฉ๋๋ค.
@SpringBootTest๋ก ์ค์ ์์ฒญ์ ๋ณด๋ด์ ์ ์ฒด์ ์ธ ๋ก์ง์ ํ ์คํธํ๋ค. ์ค์ ์์ฒญ์ ํ์ํ ๋ค์ํ ๋ฉ์๋๋ ์ ๊ณตํ๋ค.
# ์์กด์ฑ
RestAssured๋ ์ง์ ์์กด์ฑ์ ์ถ๊ฐํด์ค์ผ ํ๋ค.
dependencies {
testImplementation 'io.rest-assured:rest-assured:3.3.0'
}
# ์๋
RestAssured๋ ๋ณ๋์ ๊ตฌ์ฑ์์ด @WebMvcTest๋ฅผ ์ฌ์ฉํ์ง ๋ชปํ๋ค. ์ฌ์ฉํ๊ธฐ ์ํด์ ์๋์ ๊ฐ์ด @SpringBootTest๋ก ์ํํด์ผ ํ๋ค.
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Test {
@LocalServerPort
public int port;
@BeforeEach
void setUp() {
RestAssured.port = port;
}
...
}
@SpringBootTest๋ก ํ ์คํธ๋ฅผ ์ํํ๋ฉด ๋ฑ๋ก๋ Spring Bean์ ์ ๋ถ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ฉด์ @WebMvcTest๋ Presentation Layer์ Bean๋ค๋ง ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์๋์ ์ผ๋ก ๋น ๋ฅด๋ค.
# ๊ฐ๋ ์ฑ
@Test
public void getMember() {
given().
accept(MediaType.APPLICATION_JSON_VALUE).
when().
get("/members/1").
then().
log().all().
statusCode(HttpStatus.OK).
assertThat().body("id", equalTo(1));
}
RestAssured๋ BDD ์คํ์ผ๋ก ์์ฑํ ์ ์๊ณ ๊ฐ๋ ์ฑ์ด ์ข๋ค.
# 0904 - ๊ฐ์ฒด์งํฅ ์ค๊ณ 5์์น SOLID (SRP, OCP, LSP, ISP, DIP)
# SOLD๋?
- ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ๊ธด ์ธ์๊ณผ ์๋ง์ ์ํ์ฐฉ์ค๋ฅผ ๊ฑฐ์น๋ฉฐ 5๊ฐ์ง ์์น์ด ์ ๋ฆฌ๋์๋ค. ์ด๊ฒ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ์ 5์์น์ด๋ผ๊ณ ํ๋ฉฐ, ์๊ธ์๋ฅผ ๋ฐ์ SOLID๋ผ๊ณ ํ๋ค.
- SPR(Single Responsibility Principle) : ๋จ์ผ ์ฑ ์ ์์น
- OCP(Open Closed Principle) : ๊ฐ๋ฐฉ ํ์ ์์น
- LSP(Liskov Substitution Principle) : ๋ฆฌ์ค์ฝํ ์นํ ์์น
- ISP(Interface Segregation Principle) : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- DIP(Dependency Inversion Principle) : ์์กด ์ญ์ ์์น ์ด ์์น๋ค์ ์์ง๋๋ ๋์ด๊ณ ๊ฒฐํฉ๋๋ ๋ฎ์ถ์๋ ๊ณ ์ ์์น์ ๊ฐ์ฒด ์งํฅ์ ๊ด์ ์์ ์ฌ์ ๋ฆฝํ ๊ฒ์ผ๋ก ๋ณผ ์ ์๋ค.
# SRP = ๋จ์ผ ์ฑ ์ ์์น
์ด๋ค ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ์ด์ ๋ ์ค์ง ํ๋ ๋ฟ์ด์ด์ผ ํ๋ค.
- SRP๊ฐ ์์ง์ผ์ง ์ฌ๋ก
- ๋ณ์๋ ๋ฒจ
- ํ๋์ ์์ฑ์ด ์ฌ๋ฌ ์๋ฏธ๋ฅผ ๊ฐ๋ ๊ฒฝ์ฐ
- ์ด๋ค ๊ณณ์์๋ ์ฐ๊ณ , ์ด๋ค ๊ณณ์์ ์์ฐ๋ ์์ฑ์ด ์๋ ๊ฒฝ์ฐ
- ๋ฉ์๋๋ ๋ฒจ
- ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํ if๋ฌธ์ด ๋ง์ ๊ฒฝ์ฐ
- ๋ณ์๋ ๋ฒจ
# OCP = ๊ฐ๋ฐฉ ํ์ ์์น
์ํํธ์จ์ด ์ํฐํฐ(ํด๋์ค, ๋ชจ๋, ํจ์ ๋ฑ)๋ ํ์ฅ์ ๋ํด์๋ ์ด๋ ค ์์ด์ผ ํ์ง๋ง ๋ณ๊ฒฝ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค. ์ฆ, ์์ ์ ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์ฃผ๋ณ์ ๋ณํ์ ๋ํด์๋ ๋ซํ ์์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ interface๋ฅผ ํตํด ๊ตฌํํ์ฌ ํด๊ฒฐํ๋ค.
ํ์ค์ ์๋ฅผ๋ค๋ฉด ์์ ์ง์์ด ์๋ฌด๋ฆฌ ๋ฐ๋๋ค๊ณ ํด์ ์๋์ด ์ํ์ ๊ตฌ๋งคํ๋ ๋ฐ๋ ์ง์ฅ์ด ์๋ค.
# LSP = ๋ฆฌ์ค์ฝํ ์นํ ์์น
์๋ธํ์ ์ ์ธ์ ๋ ์์ ์ ๊ธฐ๋ฐํ์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด์ผ ํ๋ค. ์ฆ, ํ์ ํด๋์ค์ ์ธ์คํด์ค๋ ์์ํ ๊ฐ์ฒด ์ฐธ์กฐ ๋ณ์์ ๋์ ํด ์์ ํด๋์ค์ ์ธ์คํด์ค ์ญํ ์ ์ํํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ด์ผ ํ๋ค. ์ด๊ฒ์ OOP 4๋ ํน์ฑ์ ์์, ์ธํฐํ์ด์ค ์์น์ด ์ ์ง์ผ์ง๋ค๋ฉด LSP๋ ์๋์ผ๋ก ์ ์ ์ฉ๋ ๊ฒ์ด๋ค. (์ฃผ๋ก ์กฐ์ง๋, ๊ณ์ธต๋ ๊ด์ ์์์ ์์์ด LSP๋ฅผ ์๋ฐฐํ๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค)
# ISP = ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กด ๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉด ์๋๋ค. ISP๋ SRP์ ๋น์ทํ์ง๋ง ์ธํฐํ์ด์ค๋ฅผ ํตํ ๋ค๋ฅธ ํด๊ฒฐ์ฑ
์ ์ ์ํ๊ณ ์๋ค. ์๋ฅผ๋ค์ด class ์ฌ๋ implemnets ๊ตฐ์ธ
์ด๋ฉด ๊ตฐ์ธ ํ๊ธธ๋ = new ์ฌ๋()
์ ํตํด ๊ตฐ์ธ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ง์ ์ฌ์ฉํ๋๋ก ์ ํํ๋ ๊ฒ์ด๋ค. SRP ์๋ค๋ฉด class๋ฅผ ๋๋๊ฒ ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ISP๋ณด๋ค SRP๋ฅผ ๊ถ์ฅํ๋ค.
# DIP = ์์กด ์ญ์ ์์น
๊ณ ์ฐจ์ ๋ชจ๋์ ์ ์ฐจ์ ๋ชจ๋์ ์์กดํ๋ฉด ์๋๋ค. ์ถ์ํ๋ ๊ฒ์ ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ์์กดํ๋ฉด ์๋๋ค. ๊ตฌ์ฒด์ ์ธ ๊ฒ์ด ์ถ์ํ๋ ๊ฒ์ ์์กดํด์ผ ํ๋ค. ์์ฃผ ๋ณ๊ฒฝ๋๋ ํด๋์ค์ ์์กดํ์ง ๋ง์.
๋ก ์์ฝ ํ ์ ์๋ค. ์ฆ, ์์ ๋ณด๋ค ๋ณํ๊ธฐ ์ฌ์ด ๊ฒ์ ์์กดํ์ง ๋ง๋ผ๋ ๊ฒ์ด๋ค. ํด๊ฒฐ๋ฐฉ๋ฒ์ OCP์ ๋น์ทํ๋ฐ, ๊ตฌ์ฒด์ ์ธ class๊ฐ ์๋, ์ธํฐํ์ด์ค์ ์์กดํจ์ผ๋ก์จ DIP๋ฅผ ํด๊ฒฐํ๋ค.