0807 ~ 0902
# 0807 ~ 0902
# 0808 - Spring Boot ์ค์ ์ ๋ฐ๋ฅธ ๋์ ๋น ์์ฑ
์ค์ผ์ค๋ฌ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ๋ฑ๋กํ๊ธฐ ์ํด ํ์ต
# 1. @Value boolean
@Value๋ฅผ ํตํด properties ๊ฐ์ ์ฃผ์ ๋ฐ์ ์ฒ๋ฆฌ(๋์ ๋น๋ฑ๋ก์ด๋์ ๋ฌด๊ด)
@Configuration
@EnableScheduling
public class ScheduledJobs {
@Value("${jobs.enabled:true}")
private boolean isEnabled;
@Scheduled(fixedDelay = 60000)
public void cleanTempDirectory() {
if(isEnabled) {
// do work here
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# 2. @ConditionalOnProperty
@Configuration
@EnableScheduling
public class ScheduledJobs {
@Bean
@ConditionalOnProperty(value = "jobs.enabled", matchIfMissing = true, havingValue = "true")
public ScheduledJob scheduledJob() {
return new ScheduledJob();
}
}
2
3
4
5
6
7
8
9
# 3. @Profile
@Profile("prod") // or @Profile("!prod")
@Bean
public ScheduledJob scheduledJob() {
return new ScheduledJob();
}
2
3
4
5
# 4. @Conditional
@Profile ์ ๋ด๋ถ์ ์ผ๋ก @Conditional์ ์ฌ์ฉ
public class CustomCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String property = context.getEnvironment().getProperty("jobs.enabled");
return "prod".equals(property);
}
}
2
3
4
5
6
7
- property์ "jobs.enabled"์ key๊ฐ "prod"์ด๋ผ๋ฉด ๋น ๋ฑ๋ก
@Conditional(CustomCondition.class)
@Bean
public ScheduledJob scheduledJob() {
return new ScheduledJob();
}
2
3
4
5
# 0829 - Load Average
# Load Average๋
Load Average๋ ์ผ๋ง๋ ๋ง์ ํ๋ก์ธ์ค๊ฐ ์คํ ์ค ํน์ ์คํ ๋๊ธฐ์ค์ธ์ง ์๋ฏธํ๋ ์์น์ด๋ค. ์กฐ๊ธ๋ ์์ธํ ๋งํด ํ๋ก์ธ์ค ์ํ ์ค์์ R(Running)๊ณผ D(Uninterruptible waiting)์ํ ํ๋ก์ธ์ค ๊ฐ์๋ฅผ 1๋ถ, 5๋ถ, 15๋ถ๋ง๋ค ํ๊ท ๋ธ ๊ฐ์ ๋งํ๋ค. ์ฆ, ์์คํ ์ ๋ถํ๋ฅผ ํ๊ท ์น๋ก ์๋ ค์ฃผ๋ ๊ฐ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก 1๋ถ ๊ฐ๋ณด๋ค๋ 5๋ถ, 15๋ถ์ ๊ฐ์ ๋ง์ด ์ฌ์ฉํ๋ค.
# ํ๋ก์ธ์ค ์ํ R(Running)์ด๋?
- CPU์์ ์ํ์ด๋๊ณ ์๊ฑฐ๋ ์คํ๊ฐ๋ฅํ ์ํ๋ฅผ ๋งํ๋ค.
# ํ๋ก์ธ์ค ์ํ D(Uninterruptible waiting)์ด๋?
- I/O์ ๋ํด ๋๊ธฐํ๋ ์ํ๋ก ๋ค๋ฅธ ์ด๋ค์ผ๋ ํ ์ ์์์ ์๋ฏธํ๋ค.
# Load Average ํ์ธ ๋ช ๋ น์ด
- Load Average๋
uptime
๋ช ๋ น์ด๋ก ํ์ธ ๊ฐ๋ฅํ๋ฉฐ ์ด๋ /proc/loadavg ํ์ผ์ ์ด์ด์ ๊ทธ ํ์ผ์ ๋ด์ฉ์ ์ฝ๊ณ ํ๋ฉด์ ์ถ๋ ฅํด์ฃผ๋ ๋ช ๋ น์ด์ด๋ค. Load Average ๊ฐ์ ์ง์ ๊ณ์ฐํ๋๊ฒ์ ์๋๊ณ ์ปค๋์ด ๋ฏธ๋ฆฌ ์ค๋นํด๋ /proc/loadavg ํ์ผ์ ์ฝ์ด์ ๋ณด์ฌ์ฃผ๋ ๋ช ๋ น์ด์ด๋ค. uptime
๋ฟ๋ง์๋๋ผtop
,cat /proc/loadavg
์ผ๋ก ํ์ธ ๊ฐ๋ฅํ๋ค.uptime
command
$ uptime 10:23:10 up 3 days, 12:06, 1 user, load average: 1.41, 1.37, 1.35
- ์ฒซ๋ฒ์งธ ๊ฐ : 1๋ถ ๋์์ ํ๊ท ๊ฐ
- ๋๋ฒ์งธ ๊ฐ : 5๋ถ ๋์์ ํ๊ท ๊ฐ
- ์ธ๋ฒ์งธ ๊ฐ : 15๋ถ ๋์์ ํ๊ท ๊ฐ
# Load Average ๊ฐ์ ์๋ฏธ
- Load Average ๊ฐ์ CPU์ ์ฝ์ด์์ ๋ฐ๋ผ์ ์ซ์๊ฐ ๋ฌ๋ผ์ง๋ฉฐ ๊ฐ CPU ์ฝ์ด๊ฐ 100% Load๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, 1์ฝ์ด๋ ๊ฐ 1, 2์ฝ์ด๋ 2, 4์ฝ์ด๋ ๊ฐ 4๋ก ํํ์ด ๋๋ค. ๋ง์ฝ Load Average๊ฐ 4๋ผ๋ฉด, ์์คํ ์ด CPU ์ฝ์ด 4๊ฐ๋ฅผ 100% ์ฌ์ฉํ๊ณ ์๊ฑฐ๋, CPU ์ฝ์ด 1๊ฐ๋ฅผ 400% ์ฌ์ฉํ๊ณ ์๋ค๋ ์๋ฏธ์ด๋ค.
- ์์คํ ์ด์์ ๊ถ์ฅํ๋ ์๋ฒ๋ฆฌ์ง๋ 70%์ธ 0.7 ์ดํ์ด๋ฉฐ ๊ทธ ์ด์์ผ ๊ฒฝ์ฐ ์์คํ ์ ์ด์์ด ์๋์ง ๋ฐ๋์ ์ฒดํฌํด์ผ ํ๋ค.
# 0831 - AWS ์๋น์ค ์ ๋ฆฌ
# EC2
- AWS์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์ ๋๋ฆฌ ์ฐ์ด๋ ์ธํ๋ผ๋ก, ๋ฌผ๋ฆฌ ํ๊ฒฝ์ ์ปดํจํฐ์ฒ๋ผย ์ปดํจํ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ์๋น์ค
- ํด๋ผ์ฐ๋์์ ์ปดํจํ ํ์์ ๊ท๋ชจ๋ฅผ ์์ ์์ฌ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ๊ฐ์ ๋จธ์ ์ผ๋ก ์ ๊ณต๋๋ฉฐย ์ธ์คํด์ค๋ผ๊ณ ๋ถ๋ฆฐ๋ค.
- ์์ ์ฑ์ ์ํด ์ฌ๋ฌ AWSย ๋ฆฌ์ ๊ณผ ๊ฐ์ฉ ์์ญ์ ๊ฑธ์ณ ๋ฐฐํฌ
# AWS Auto Scaling
- ํธ๋ํฝ์ ๋ฐ๋ผ EC2 ์ธ์คํด์ค๋ค์ย ์๋์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ ๊ฑฐํด์ฃผ๋ ์๋น์ค
- ELB์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ผ๋ก ํน์ ํธ๋ํฝ์ ์ด๊ณผ์ ์๋์ผ๋ก EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๋ค์ ํธ๋ํฝ์ด ์ค์ด๋ค๋ฉด ์ถ๊ฐ ์์ฑํ์๋ EC2 ์ธ์คํด์ค๋ค์ ์ญ์ ํ๋ ์ ์ฐํ ์๋น์ค๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ๋์์ฃผ๋ ์๋น์ค
# Lambda (Serverless Computing)
- ๋ชจ๋ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฐฑ์๋ ์๋น์ค์ ๋ํ ์ฝ๋๋ฅผ ๋ณ๋์ ๊ด๋ฆฌ ์์ด ์คํํ๋ ์๋น์ค
- ์ฌ์ฉ์๋ ์๋ฒ์ ๋ํ ๊ฑฑ์ ์์ดย ์ฝ๋๋ง์ผ๋ก ์๋น์ค๋ฅผ ์คํํ ์ ์๋ค.
- serverless ์ํคํ ์ณย ๊ตฌํ์ ์ฌ์ฉ
- ์๋ฒ ๋ฐ ์ด์ ์ฒด์ ์ ์ง ๋ณด์, ์ฉ๋ ํ๋ก๋น์ ๋ ๋ฐ ์๋ ํ์ฅ, ์ฝ๋ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ๊ณผ ๊ฐ์ ์ปดํจํ ๋ฆฌ์์ค์ ๋ชจ๋ ๊ด๋ฆฌ๋ฅผ ์์ฒด์ ์ผ๋ก ์ํํ๋ฏ๋ก, Lambda๊ฐ ์ฌ์ฉํ๋ ์ธ์ด ์ค ํ๋๋ก ์ฝ๋๋ฅผ ์ ๊ณตํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
# Lightsail
VPS
(Virtual Private Server) ์๋น์ค- ์ฃผ์ด์ง ๋ฆฌ์์ค ์ต์ (Ubuntu, Node, Lamp stack, Nginx, WordPress, Django.. etc) ์ค ํ๋๋ฅผ ํํ์ฌ ๋จ์ผ ๊ฐ์ ์๋ฒ๋ฅผ ์ฝ๊ฒ ์ค์ ํ ์ ์๋ค.
- ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๊ฒ ์์ํ๋ ๋ฐ ํ์ํ ๊ฐ์๋จธ์ , SSD๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง, ๋ฐ์ดํฐ ์ ์ก, DNS๊ด๋ฆฌ, ์ ์ IP๊ฐ ํฌํจ๋์ด ์๋ค.
# ECS(Elastic Container Service)
- ํด๋ผ์ฐ๋ ์๋ฒ์ธ EC2๋ฅผย Docker ์ปจํ ์ด๋๋ก ๊ด๋ฆฌย ๊ฐ๋ฅํ๋๋ก ๋์จ ์๋น์ค
- ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ๊ณ ๋๋ก ์์ ํ๊ณ , ์์ ์ ์ด๊ณ , ํ์ฅ ๊ฐ๋ฅํ ๋ฐฉ์์ด๋ค.
- AWS Fargate ์ฌ์ฉ๊ฐ๋ฅ
AWS Fargate
๋ ๋ณ๋๋ก ์ธ์คํด์ค๋ฅผ ์์ฑ ๊ด๋ฆฌํ์ง ์๊ณ , ์์ ํ ๋งค๋์ง๋ ์๋น์ค์ ํํ๋ก ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํ์ํฌ ์ ์๋ ์๋ง์กด์ ์๋น๋ฆฌ์ค ์ปจํ ์ด๋ ์ํ์ด๋ค.ย Dockerย ์ด๋ฏธ์ง๊ฐ ๋ฆฌํ์งํฐ๋ฆฌ์ ํธ์๋์ด ์๋ค๋ฉด,ย ํด๋ฌ์คํฐย โย ์์ ์ ์ย โย ์๋น์ค์ ์์๋ก ์์ฑํ์ฌ ์์ ํ 24์๊ฐ ์๋น์ค ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํ ์ ์๋ค
# EB(Elastic Beanstalk)
- Java, .NET, PHP, Node.js, Python, Ruby, Go, Docker๋ฅผ ์ฌ์ฉํ์ฌย Apache, Nginx, Passenger, IIS์ ๊ฐ์ ์น์ํ ์๋ฒ์์ ๊ฐ๋ฐ๋ย ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋น์ค๋ฅผ ๊ฐํธํ๊ฒ ๋ฐฐํฌํ๊ณ ์กฐ์ ํ ์ ์๋ ์๋น์ค
# CodeDeploy
- Amazon EC2 ์ธ์คํด์ค, ์จํ๋ ๋ฏธ์ค ์ธ์คํด์ค, ์๋ฒ๋ฆฌ์ค Lambda ํจ์ ๋๋ Amazon ECS ์๋น์ค๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ ๋ฐฐํฌ ์๋น์ค
- CodeDeploy๋ ์๋ฒ์์ ์คํ๋๊ณ Amazon S3 ๋ฒํท, GitHub ๋ฆฌํฌ์งํ ๋ฆฌ ๋๋ Bitbucket ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์ฅ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝํ ์ธ ๋ฅผ ๋ฐฐํฌํ ์ ์๋ค. ๋ํ CodeDeploy๋ ์๋ฒ๋ฆฌ์ค Lambda ํจ์๋ฅผ ๋ฐฐํฌํ ์ ์๋ค. CodeDeploy๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค
# ECR(Elastic Container Registry)
- AWS์์ ์ ๊ณตํ๋ Docker Hub์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก,ย Amazon Elastic Container Registry์ ์ฝ์๋ก ์์ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ AWS ๊ด๋ฆฌํ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ ์๋น์ค
- Amazon ECR์ AWS IAM์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ๊ธฐ๋ฐ ๊ถํ์ ๊ฐ์ง ํ๋ผ์ด๋น ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ง์
- Docker Hub์ ๋์ผํ๋ค๊ณ ๋ณผ ์ ์์ง๋ง ์ฅ์ ์ผ๋ก๋ย S3๋ก Docker Image๋ฅผ ๊ด๋ฆฌํ๋ฏ๋ก ๊ณ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๊ณ , AWS IAM ์ธ์ฆ์ ํตํด ์ด๋ฏธ์ง push/pull์ ๋ํ ๊ถํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅ
# 0901 - Mockito์ BDDMockito ์ฐจ์ด
# Mockito
- Mock ๊ฐ์ฒด๋? ์ค์ ์ฌ์ฉํ๋ ๋ชจ๋์ ์ฌ์ฉํ์ง ์๊ณ ์ค์ ์ ๋ชจ๋์ "ํ๋ด"๋ด๋ "๊ฐ์ง" ๋ชจ๋์ ์์ฑํ์ฌ ํ ์คํธ์ ํจ์ฉ์ฑ์ ๋์ด๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฐ์ฒด
- Mock ๊ฐ์ฒด๋ฅผ ์ฝ๊ฒ ๋ง๋ค๊ณ , ๊ด๋ฆฌํ๊ณ , ๊ฒ์ฆํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ
@ExtendWith(MockitoExtension.class)
์ ์ธ
@Test
void hasSkill_AlwaysTrue() {
// given
when(skills.hasSkill()).thenReturn(true);
// when
boolean actual = person.hasSkill();
// then
assertThat(actual).isTrue();
}
2
3
4
5
6
7
8
9
10
11
# BDDMockito
BDDMockito provides BDD aliases for various Mockito methods, so we can write our Arrange step using given (instead of when), likewise, we could write our Assert step using then (instead of verify) -ย Quick Guide to BDDMockito(Baeldung) (opens new window)
- BDD๋? Behavior-Driven Development์ ์ฝ์๋กย ํ์ ์ฃผ๋ ๊ฐ๋ฐ์ ๋งํ๋ค. ํ ์คํธ ๋์์ย ์ํ์ ๋ณํ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ด๊ณ , ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์คํธํ๋ ํจํด์ ๊ถ์ฅํ๋ค
- ์ฌ๊ธฐ์ ๊ถ์ฅํ๋ ๊ธฐ๋ณธ ํจํด์ย Given, When, Then ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค
- BDDMockito์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉดย Mockito์ ์์ํ ํด๋์ค์์ ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋์์ด๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๋ํย Mockito์ ๊ฑฐ์ ์ฐจ์ด๊ฐ ์๋ค.
- Mockito์ย
when()
ย ๋ฉ์๋๊ฐ ์๋ยgiven()
ย ๋ฉ์๋ - Mockito์์ ์ ๊ณตํ๋ย
verify()
ย ๋ยthen().should()
ย ๋ก ๋์ฒด
- Mockito์ย
- Mockito์ ๊ฐ๋ ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํย ๊ธฐ๋ฅ์ ๊ฐ์ง๋ง ์ด๋ฆ๋ง ๋ค๋ฅธ ํด๋์ค
@Test
void hasSkill_AlwaysTrue() {
// given
given(skills.hasSkill()).willReturn(true);
// when
boolean actual = person.hasSkill();
// then
assertThat(actual).isTrue();
}
2
3
4
5
6
7
8
9
10
11