일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 클린코드
- framework
- 그리디
- 데이터베이스
- 읽기쉬운코드
- 엘라스틱서치
- Java
- Spring
- 스프링
- 애자일기법
- 그리디알고리즘
- cleancode
- JPA
- 코딩
- 코드
- 애자일
- 자바
- spring boot
- 백준
- 프레임워크
- database
- Baekjoon
- ES
- 알고리즘
- API
- 개발
- Elasticsearch
- 코딩테스트
- 애자일프로그래밍
- 개발자
- Today
- Total
목록전체 글 (173)
튼튼발자 개발 성장기🏋️
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/emEhjS/btr65r4G0uk/xzSGAYj3oVbYPYYf9mJ5b1/img.png)
Alpine linux에 대해 살짝 알아보고 가자. 알파인 리눅스는 보안/간편성/리소스 효율을 위해서 디자인된 리눅스 배포판이다. [그림 1]과 같이 알파인 리눅스는 glibc 대신에 musl libc를 사용하게 되었는데 라이브러리의 size 차이가 많이 차이나는 사실을 알 수 있다. docker images 상기 command로 OS 이미지의 크기를 [그림 2 ]와같이 알 수 있다. 타 OS 이미지와 비교해보았을 때 알파인이 훨신 더 경량화되어있다는 것을 알 수 있다. 이 처럼 size가 중요한 이유는 메모리/디스크 공간을 적게 잡아먹고, 로딩이 빠른만큼 앱이 올라가는 속도가 빨라진다. 하지만 많은 dependency 라이브러리가 빠져있기 때문에 멀티 스테이지 빌드 방식을 사용한다. # Alpine l..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bc7Ehc/btr63m2O9KS/kNXAlwbMEFKfq7TgcNdY80/img.png)
이번 포스팅에서 하는 이야기는 Docker의 다중 운영체제이다. [그림 1]과 같이 Docker에서 다중 운영체제 사용이 가능할까? 백문이 불여일견이라고, 한 번 해보면 평생 기억할 것 같아 직접 해본다. Docker Hub에 접속하면 다양한 OS의 이미지를(배포판) 다운받을 수 있다! 혹은 아래와 같이 command로도 가능하다. cat /etc/os-release# Host OS 확인 docker pull fedora# fedora 이미지 다운 docker run --rm fedora cat /etc/os-release# 실행 실행을 해본다면 [그림 1]의 그림이 가능한 이야기인지 알 수 있을 것이다. (정답은 가능하다.) 그 이유는 무엇일까? docker는 OS레벨 가상화 기술이라고 한다. 그럼 O..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/usRnD/btr3WbQAT6n/BrI1Qa7stjukTdIkvOKkuk/img.jpg)
흔하게 볼 수 있는 docker짤이다. 대학생 때나 신입 때 누구나 이런 말을 해본적이 있을테지.. "내 컴터에선 왜 안돼?!?!" 코드가 똑같다면 대부분 환경이 달라서 다른 결과가 나오는 경우가 있을텐데, 이것을 해결해주는 것이 Docker라 볼 수 있다. 아래 [그림 2]를 보면 docker의 형태를 알 수 있다. 앱을 구동하기위한 코드와 종속성, runtime을 하나로 묶어서 local, dev환경을 비롯한 스테이징, 라이브환경 등 다양한 환경에 배포를 할 수 있다. "이 그림에서 docker를 왜 쓰는가?!"에 대한 답을 볼 수 있는데, 개발자가 만들었던 아티펙트가 컨테이너 런타임이 동작하는 어떤 환경에 구애받지 않고 동일한 아티펙트가 동작한다. 개발자가 앱을 빌드하고 배포하는 속도를 향상시킨다...
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/czPMEV/btrMKsQHSDv/VbGXum19u3r4ttJfVK7171/img.png)
단위 테스트 JUnit과 Mockito를 사용한 단위 테스트를 알아보는 시간~😄 JUnit 테스트는 테스트 케이스라고도 하는데 클래스 레벨에서 특정 기능을 테스트하는 것으로써 클래스 당 하나 이상의 테스트 케이스를 가진다. import org. junit. jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class StringTest { @Test public void testStringEquals() { String michael = "Michael"; String michael2 = michael; String michael3 = new String("Michael"); String michael4 = "Michae..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cvx2W2/btrME1LeI5s/qDwo8u1kTbgYGK3RKM85h0/img.png)
서킷 브레이커: 배치 내에서 호출하는 rest api에 과부화가 걸렸을 때 사용 서킷 브레이커 패턴을 구현하여 스프링 배치는 [스프링 리트라이]라는 라이브러리에 의존한다 implementation group: 'org.springframework.retry', name: 'spring-retry', version: '1.3.3' 서킷 브레이커로 래핑할 메서드를 식별 식별된 매서드에서 발생한 예외 건수가 임계값을 초과하면 서킷 브레이커가 해당 매서드에 대한 호출을 중지 및 대체 매서드로 트래픽을 라우팅 대체 매서드는 원래 메서드와 다른 처리방식 ex. api가 반환하는 값 대신 기본 값을 반환 특정 알고리즘을 기반으로 다시 원래 메서드로 트래픽을 되돌려 다시 정상인 상태로 되돌아 왔는지 테스트 서킷 브레이..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/py7gO/btrKpRKQWOK/870ZoL0Ym3x3ggRFRxUPyk/img.png)
1. Stream을 활용한 최대값, 최소값, 개수 추출하기 /** * Returns the minimum element of this stream according to the provided * {@code Comparator}. This is a special case of a * reduction. * * This is a terminal operation. * * @param comparator a non-interfering, * stateless * {@code Comparator} to compare elements of this stream * @return an {@code Optional} describing the minimum element of this stream, * or an..
Stream의 종결처리 과정을 이해하기 위해 Optional을 필수로 알아야하는 도구이다. Optional이 어떤 문제를 해결해주는걸까? 우리가 가장 많은 고민을 했던 NPE(NullPointException)가 Oprional의 사용 목적의 핵심이다. NPE는 Runtime error이기 때문에 실행 전까지 발견하기 쉽지가 않다. 현업에서도 종종 NPE가 발생해서 빠른 대응이 필요할 때도 있다. @Getter @Builder @ToString class User { private int id; private String name; private String email; private boolean isVerified; } public class Exercise { public static void ma..
Stream은 JAVA 8에서 추가 된 도구로써 함수형 인터페이스를 활용해서 데이터를 매우 간편하고 간결하게 가공할 수 있도록 도와준다. 이번 포스트에서는 이 Stream의 built in method에 대해서 알아보는 시간을 가진다. Stream은 데이터의 가공되는 흐름을 한 눈에 알아보기 쉽게 가독성을 향상시키는 장점이 있다. 이로인한 이유로 기존에 loop로 짰던 로직을 Stream으로 간결하고 직관적으로 대체가 가능하다. 또한 병렬처리도 가능하다. 다음 아래 내용은 Stream으로 변환하는 세 가지 방법을 소개한다. // Stream 변환 A방법 Stream nameStream = Stream.of("홍길동", "김길동", "박길동"); List names = nameStream.collect(..