스파르타 Java 단기 심화 과정
코드카타
프로그래머스 12930 이상한 문자 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/12930
— 문제 설명
- 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
— 제한 조건
- 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
- 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
— 입출력 예
| s | return |
|---|
| "try hello world" | "TrY HeLlO WoRlD" |
- "try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.
— 문제 풀이
import java.util.*;
class Solution {
public String solution(String s) {
StringBuilder sb = new StringBuilder();
int cnt = 0;
for(int i=0;i<s.length();i++){
if(s.charAt(i) ==' ') {
cnt = 0;
sb.append(" ");
continue;
}
sb.append(cnt % 2 == 0 ? s.substring(i,i+1).toUpperCase():s.substring(i,i+1).toLowerCase());
cnt++;
}
return sb.toString();
}
}
프로그래머스 131705 삼총사
https://school.programmers.co.kr/learn/courses/30/lessons/131705
— 문제 설명
- 한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
- 한국중학교 학생들의 번호를 나타내는 정수 배열
number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
— 제한 조건
- 3 ≤
number의 길이 ≤ 13
- 1,000 ≤
number의 각 원소 ≤ 1,000
- 서로 다른 학생의 정수 번호가 같을 수 있습니다.
— 입출력 예
| number | result |
|---|
| [-2, 3, 0, 2, -5] | 2 |
| [-3, -2, -1, 0, 1, 2, 3] | 5 |
| [-1, 1, -1, 1] | 0 |
입출력 예 #1
입출력 예 #2
- 학생들의 정수 번호 쌍 (-3, 0, 3), (-2, 0, 2), (-1, 0, 1), (-2, -1, 3), (-3, 1, 2) 이 삼총사가 될 수 있으므로, 5를 return 합니다.
입출력 예 #3
— 문제 풀이
class Solution {
public int result = 0;
public int solution(int[] number) {
cal(0,0,0,number);
return result;
}
public void cal(int cnt, int cur, int sum, int[] number){
if(cnt==3 && sum == 0){
result++;
return;
}else{
for(int i=cur;i<number.length;i++){
cal(cnt+1, i+1, sum+number[i], number);
}
}
}
}
프로그래머스 147355 크기가 작은 부분 문자열
https://school.programmers.co.kr/learn/courses/30/lessons/147355
— 문제 설명
- 숫자로 이루어진 문자열
t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
- 예를 들어,
t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.
— 제한 조건
- 1 ≤
p의 길이 ≤ 18
p의 길이 ≤ t의 길이 ≤ 10,000
t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.
— 입출력 예
| t | p | result |
|---|
| "3141592" | "271" | 2 |
| "500220839878" | "7" | 8 |
| "10203" | "15" | 3 |
입출력 예 #1
본문과 같습니다.
입출력 예 #2
p의 길이가 1이므로 t의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며 이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.
입출력 예 #3
p의 길이가 2이므로 t의 부분문자열은 "10", "02", "20", "03"이며, 이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다. "02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요
— 문제 풀이
import java.util.*;
class Solution {
public int solution(String t, String p) {
ArrayList<String> subStr = new ArrayList<>();
for(int i=0;i<t.length()-(p.length()-1);i++){
subStr.add(t.substring(i,i+p.length()));
}
Long pVal = Long.parseLong(p);
int answer = 0;
for(String sub : subStr){
Long subVal = Long.parseLong(sub);
if(subVal <= pVal) answer++;
}
return answer;
}
}
Spring 심화주차 강의
Junit
자바 프로그래밍 언어용 단위 테스트 프레임워크
Junit 사용
- 테스트 코드 Before After 어노테이션
- 테스트 코드를 커스텀하는 어노테이션
- 테스트 코드를 반복하는 어노테이션
- @RepeatedTest(value, name) : value 값만큼 테스트코드를 반복 실행시키는 어노테이션
- 사용 예시 : @RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
- @ParameterizedTest : @ValueSource를 활용해 Parameter 값으로 테스트하는 어노테이션
- 사용 예시
@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
System.out.println("5 * num = " + 5 * num);
}
- https://github.com/lukeydokey/Sparta-Spring/commit/68dfb02399b3c8f81fec5821eeac76907e0f6132
- Assertions
- assertEquals(expected, result) : 기대값과 결과 값이 동일한 지 확인하는 메서드
- assertEquals(expected, result, () → “{내용}”) : 테스트 실패 시 {내용} 부분을 메세지로 전달 가능
- assertNotEquals(unexpected, result) : 기대하지 않은 값과 결과 값이 다른 지 확인하는 메서드
- assertTrue(boolean expected) : 기대 값이 참이 맞는 지 확인하는 메서드
- assertFalse(boolean expected) : 기대 값이 거짓이 맞는 지 확인하는 메서드
- assertNotNull(result) : 값이 not null 이 맞는 지 확인하는 메서드
- assertNull(result) : 값이 null 이 맞는 지 확인하는 메서드
- assertThrows(Exception, ()→ Method) : 메서드 실행 시 지정한 Exception이 발생하는 지 확인하는 메서드 ( Exception variable에 값을 저장할 수 있다 )
- https://github.com/lukeydokey/Sparta-Spring/commit/84ab8719d450245b148da7e6e3fb473866fbd256
- 테스트 코드 패턴
Mockito
가짜 객체(Mock Object)를 쉽게 생성하게 해주는 프레임워크
통합테스트
단위 테스트 VS 통합 테스트
단위 테스트 : 하나의 모듈이나 클래스에 대해 세밀한 부분까지 테스트
통합 테스트 : 두 개 이상의 모듈이 연결된 상태를 테스트 / 모듈 간 연결에서 발생하는 에러 검증 가능
Controller 테스트
MSA 강의
MSA 정의
Microservices Architecture (MSA)
- MSA는 하나의 어플리케이션을 여러 개의 독립적인 서비스로 분리하여 개발, 배포, 유지보수를 용이하게 하는 소프트웨어 아키텍처
- 각 서비스는 특정 비즈니스 기능을 수행하며, 서로 독립적으로 배포되고 확장될 수 있음
- 서비스간 통신은 주로 HTTP/HTTPS, 메시지 큐 등을 통해 이루어짐
MSA 주요 특징
- 독립적인 배포 가능성 : 각 서비스는 독립적으로 배포할 수 있음
- 기술 스택의 다양성 : 각 서비스는 적절한 기술 스택을 자유롭게 선택할 수 있음
MSA 장단점
- 장점
- 확장성 : 각 서비스는 독립적으로 확장 가능, 특정 기능에 대한 성능 최적화 용이
- 유연성 : 다양한 기술 스택을 사용하여 서비스별 최적화 가능
- 독립적 배포 : 서비스별로 독립적 배포 가능
- 작은 팀 구성 : 서비스별 작은 팀으로 구성되어 민첩한 개발 가능
- 단점
- 복잡성 : 서비스 간 통신, 데이터 일관성 유지, 트랜잭션 관리 등의 복잡성이 증가
- 운영 비용 : 각 서비스의 모니터링, 로깅, 장애 대응 등을 개별적으로 관리해야 하므로 운영 비용이 증가
- 데이터 관리 : 분산된 데이터베이스로 인해 데이터 일관성 유지가 어려울 수 있음
- 네트워크 지연 : 서비스 간 통신이 네트워크를 통해 이루어지므로 지연 시간 발생
Spring Cloud 정의
- 마이크로서비스 개발을 위해 다양한 도구와 서비스를 제공하는 스프링 프레임워크의 확장
- MSA를 쉽게 구현하고 운영할 수 있게 도움
Spring Cloud 주요 기능
- 서비스 등록 및 디스커버리: Eureka, Consul, Zookeeper
- 로드 밸런싱: Ribbon, Spring Cloud LoadBalancer
- 서킷 브레이커: Hystrix, Resilience4j
- API 게이트웨이: Zuul, Spring Cloud Gateway
- 구성 관리: Spring Cloud Config
- 분산 추적: Spring Cloud Sleuth, Zipkin
- 메시징: Spring Cloud Stream
Spring Cloud 주요 모듈
- 서비스 등록 및 디스커버리
- Eureka
- 넷플릭스가 개발한 서비스 디스커버리 서버, MSA에서 각 서비스의 위치를 동적으로 관리
- 주요 특징
- 서비스 레지스트리 : 모든 서비스 인스턴스의 위치를 저장하는 중앙 저장소
- 헬스 체크 보장
- 로드 밸런싱
- Ribbon
- 넷플릭스가 개발한 클라이언트 사이드 로드 밸런서
- 주요 특징
- 서버 리스트 제공자 : Eureka로부터 서비스 인스턴스 리스트를 제공받아 로드 밸런싱에 사용
- 로드 밸런싱 알고리즘 : RR(라운드로빈), 가중치 기반 등 다양한 알고리즘 지원
- Failover : 요청 실패 시 다른 인스턴스로 자동 전환
- 서킷 브레이커
- Hystrix
- 넷플릭스가 개발한 서킷 브레이커 라이브러리로, 서비스간 호출 실패를 감지하고 시스템 전체적인 안정성 유지
- 주요 특징
- 서킷 브레이커 상태 : 클로즈드, 오픈, 하프-오픈 상태를 통해 호출 실패를 관리
- Fallback : 호출 실패 시 대체 로직을 제공하여 시스템 안정성 확보
- 모니터링 : Hystrix Dashboard를 통해 서킷 브레이커 상태 모니터링
- Resilience4j
- Resilience4j는 자바 기반의 경량 서킷 브레이커 라이브러리로, 넷플릭스 Hystrix의 대안으로 개발
- 주요 특징
- 서킷 브레이커 : 호출 실패를 감지하고 서킷을 열어 추가적인 호출 차단
- Fallback : 호출 실패 시 대체 로직을 실행하여 시스템 안정성 유지
- 타임아웃 설정 : 호출의 응답 시간을 설정하여 느린 서비스 호출에 대응할 수 있음
- 재시도 : 재시도 기능을 지원하여 일시적인 네트워크 문제 등에 대응할 수 있음
- API 게이트웨이
- Zuul
- 넷플릭스가 개발한 API 게이트웨이로, 모든 서비스 요청을 중앙에서 관리
- 주요 특징
- 라우팅 : 요청 URL에 따라 적절한 서비스로 요청 전달
- 필터 : 요청 전후에 다양한 작업을 수행할 수 있는 필터 체인 제공
- 모니터링 : 요청 로그 및 메트릭을 통해 서비스 상태 모니터링 할 수 있음
- Cloud gateway
- 스프링 클라우드에서 제공하는 API 게이트웨이
- 주요 특징
- 라우팅 및 필터링 : 요청을 받아 특성 서비스로 라우팅하고 필요한 인증 및 권한 부여를 수행
- 보안 : 외부 요청으로부터 어플리케이션을 보호하고, 보안 정책을 적용
- 효율성 : MSA에서 필요한 요청 어리 및 분산 환경 관리를 효율적으로 수행
- 구성 관리
- Spring Cloud Config
- 분산 환경에서 중앙 집중식 설정 관리를 제공
- 주요 특징
- Config 서버 : 중앙에서 설정 파일을 관리하고 각 서비스에 제공
- Config 클라이언트 : Config 서버에서 설정을 받아 사용하는 서비스
- 설정 갱신 : 설정 변경 시 서비스 재시작 없이 실시간으로 반영
코드카타와 학습하신 내용 모두 잘 작성하셨군요! 앞으로도 꾸준히 작성해보아요~!