TestInsatnce

목표 @TestInstance의 용도를 이해한다. Junit의 라이프사이클 Junit에서는 기본적으로 각 테스트 메서드마다 새로 해당 클래스의 인스턴스를 만든다. 따라서, 아래 테스트 코드는 모두 통과한다. class AdditionTest { private int sum = 1; @Test void addingTwoReturnsThree() { sum += 2; assertEquals(3, sum); } @Test void addingThreeReturnsFour() { sum += 3; assertEquals(4, sum); } } 테스트 마다 공유하는 상태가 필요한 경우 아래의 경우 테스트 메서드 사이에 공유가 되어야 하는 상태가 필요할 수 있다. 리소스 초기화 비용이 큰 경우 @Order 어노테이션으로 각 테스트 메서드가 순차적으로 처리되는 경우(단위 테스트에서는 안티 패턴이지만, 통합 테스트에서는 유용할 수 있다....

2024-09-15 · 1 min · 165 words

TestExecutionListener

목표 TestExecutionListner가 무엇인지 이해한다. TestExecutionListner의 사용법을 이해한다. TestExecutionListner Junit의 @BeforeEach, @AfterEach, @BeforeAll, @AfterAll 같이 테스트 라이프사이클에 추가적으로 동작해야 되는 내용이 있을 때 사용할 수 있다. Spring test에서 제공하는 인터페이스로 이를 상속해서 구현할 수 있다. 인터페이스 public interface TestExecutionListener { default void beforeTestClass(TestContext testContext) throws Exception {}; default void prepareTestInstance(TestContext testContext) throws Exception {}; default void beforeTestMethod(TestContext testContext) throws Exception {}; default void afterTestMethod(TestContext testContext) throws Exception {}; default void afterTestClass(TestContext testContext) throws Exception {}; } beforeTestClass: 클래스 내의 모든 테스트를 실행하기 전에 실행한다....

2024-09-15 · 2 min · 244 words

TCP 흐름 제어

목적 TCP를 사용하는 두 호스트가 있을 때, 발신자의 전송 속도가 너무 빨라서 수신자의 버퍼를 오버플로우 시키는 경우를 방지하기 위한 목적이다. 슬라이딩 윈도우 TCP는 흐름 제어를 위해 슬라이딩 윈도우 기법을 사용한다. TCP 윈도우는 데이터의 일부를 받았다는 ACK 패킷을 받기 전에 발신자가 보낼 수 있는 데이터의 크기다. 발신자는 자신의 윈도우 안에 있는 패킷들을 모두 보낼 수 있으며, 각 패킷에 대해서 타임아웃 타이머를 시작해야된다. 수신자로부터 ACK 패킷을 받게되면, ACK 번호만큼 윈도우를 오른쪽으로 밀 수 있다....

2024-09-15 · 1 min · 83 words

TCP 연결 종료는 연결 요청과 다르게 4-way 핸드셰이크인 이유

연결 과정에서는 3-way 핸드셰이크인데, 연결 종료시에는 왜 비효율적으로 4-way로 동작하는지 의문이 들었다. 그 이유는 클라이언트가 서버에게 연결 종료 요청을 해도 서버는 클라이언트에게 보내야될 데이터가 남아 있을 수 있기 때문이다. 4-way 핸드셰이크의 과정을 상세히 적게된다면 아래와 같다. 클라이언트가 서버에거 FIN 패킷을 보낸다. 서버가 클라이언트에게 ACK 패킷을 보낸다. 서버가 클라이언트에게 보내야 될 남은 데이터들을 보낸다. 서버가 클라이언트에게 FIN 패킷을 보낸다. 클라이언트가 서버에게 ACK 패킷을 보낸다. 참고 자료 https://velog.io/@arielgv829/CS-network-TCP-3-way-handshake-4-way-handshake https://stackoverflow.com/questions/46212623/why-tcp-termination-need-4-way-handshake

2024-09-15 · 1 min · 67 words

Tasklet vs Step

목표 Spring batch의 Tasklet과 Step의 차이점을 이해한다. 차이점 Tasklet은 Step 안의 작업의 전략을 나타내는 함수형 인터페이스다. Job에는 여러개의 Step이 있고, Step은 Tasklet을 이용해 표현할 수 있다. 참고 자료 https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/core/step/tasklet/Tasklet.html https://stackoverflow.com/questions/40041334/difference-between-step-tasklet-and-chunk-in-spring-batch

2024-09-15 · 1 min · 30 words

System out print() 테스트하기

System.setOut() 메소드를 통해서 시스템의 기본 출력을 설정할 수 있다. private ByteArrayOutputStream byteArrayOutputStream; @BeforeEach void setUp() { byteArrayOutputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(byteArrayOutputStream)); } @Test public void out() { System.out.print("hello"); assertEquals("hello", byteArrayOutputStream.toString()); } 참고 자료 https://stackoverflow.com/questions/1119385/junit-test-for-system-out-println

2024-09-15 · 1 min · 35 words

String의 hashCode()

Java의 String의 hashCode() 메소드는 같은 문자열이면 같은 값이 나온다. 하지만 반환값이 int기 때문에 오버플로우가 발생해서 음수가 나올 수 있다는 것도 충분히 고려해야된다. 만약 String의 hashCode를 이용해서 추가적인 작업을하는데 0부터 시작하길 원한다면 아래처럼 구현하면 된다. long avatarIndex = ((long) nickname.hashCode() - Integer.MIN_VALUE) % NUMBER_OF_AVATAR;

2024-09-15 · 1 min · 43 words

String을 뒤집는 방법

StringBuilder에 reverse 기능이 존재한다. String reversed = new StringBuilder(original).reverse().toString() 참고 자료 https://stackoverflow.com/questions/7569335/reverse-a-string-in-java

2024-09-15 · 1 min · 12 words

String을 LocalDate로 변환하기

DateTimeFormatter 로 문자열의 날짜 형식을 지정하고 파싱하면된다. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/MM/yyyy"); String date = "16/08/2016"; //convert String to LocalDate LocalDate localDate = LocalDate.parse(date, formatter); 참고 자료 https://mkyong.com/java8/java-8-how-to-convert-string-to-localdate/

2024-09-15 · 1 min · 27 words

String으로 원하는 Enum 찾기

Enum에 valueOf() 메서드를 이용하면 된다. 참고 자료 https://stackoverflow.com/questions/604424/how-to-get-an-enum-value-from-a-string-value-in-java

2024-09-15 · 1 min · 8 words

String안에 특정 문자의 마지막 인덱스 찾기

abc.txt.jpg 같은 파일이름을 파싱할 때, 확장자를 jpg로 구하기 위해서 ‘.‘문자의 마지막 인덱스 위치를 알아야 됐다. fileName.lastIndexOf(FILE_EXTENSION_DELIMITER); Java에 String의 메소드로 lastIndexOf라는 메소드가 있어서 쉽게 구현할 수 있었다.

2024-09-15 · 1 min · 26 words

Stream을 collection으로 만든 후 추가 적인 작업이 필요한 경우

passengers.stream() .map(name -> new Person(name)) .collect(Collectors.collectingAndThen(Collectors.toList(), Bus::new)); collectingAndThen()메소드를 활용하면 된다. 참고 자료 https://stackoverflow.com/questions/52382157/continue-mapping-after-stream-collect

2024-09-15 · 1 min · 13 words

stream에서 findFirst(), findAny() 사용시 NPE

배경 null 값을 가지고 있는 stream에서 findFirst() 메서드를 호출하니 NullPointerException이 발생했다. 원인 공식 문서를 읽어보니 선택된 요소가 null이면 NullPointerException이 발생한다. 비어있는 Optional이 반환되는 경우는 stream이 비어있는 경우만 해당된다. 참고 자료 https://docs.oracle.com/javase/10/docs/api/java/util/stream/Stream.html#findFirst()

2024-09-15 · 1 min · 31 words

Stream groupingBy

어떤 객체의 List가 있을 때, 객체의 특정 필드값을 기준으로 묶는 과정이 필요했다. 그 때, stream의 groupingBy 을 사용하면된다. 예를들어, 블로그 포스트를 타입별로 묶고싶은 경우 아래 예시를 보면된다. class BlogPost { String title; String author; BlogPostType type; int likes; } enum BlogPostType { NEWS, REVIEW, GUIDE } Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream() .collect(groupingBy(BlogPost::getType)); 참고 자료 https://www.baeldung.com/java-groupingby-collector

2024-09-15 · 1 min · 55 words

state, props

state와 props 둘 다 react의 구성요소인 컴포넌트를 렌더링하기 위한 정보를 담고 있다. state는 컴포넌트 안에서 관리되는 반면, props는 컴포넌트에게 정보를 전달하는 용도로 사용한다. setState() setState() 함수를 이용해서 state의 값을 변경하면 컴포넌트가 리렌더링된다. setState() 함수는 비동기로 처리되기때문에, 이 함수를 호출했다고 바로 state가 변경될거라고 생각하면 안된다. state의 이전값을 기준으로 값을 변경하고 싶다면 아래와 같이 함수를 전달하는 방식으로 구현해야된다. this.setState((state) => { // 중요: 값을 업데이트할 때 `this.state` 대신 `state` 값을 읽어옵니다. return {count: state....

2024-09-15 · 1 min · 78 words

SSH 접근을 위한 public private key 생성하기

ssh-keygen 이라는 명령어를 통해서 생성할 수 있다. ssh-keygen 위와 같이 아무를 옵션없이 키 쌍을 생성하면, ~/.ssh/id_rsa.pub 라는 파일에 생성된다. -t 옵셩능 사용하여 알고리즘과 크의 크기를 지정할 수도 있다. ssh-keygen -t rsa -b 4096 해당 키를 사용할 서버의 ~/.ssh/authorized_keys에 퍼블릭 키를 추가하면 된다. 참고 자료 https://m.blog.naver.com/sehyunfa/221737099486

2024-09-15 · 1 min · 45 words

Squash Merge 문제점

git squash는 conflict가 발생할 확률이 높다. sqaush merge로 병합을 해도 실제로는 병합이 아닌 새로운 커밋으로 만들어지기 때문에 merge한 브랜치와 conflict가 발생한다. https://stackoverflow.com/questions/11797904/git-merge-squash-and-recurring-conflicts

2024-09-15 · 1 min · 22 words

Sqrt Decomposition

문제 상황 처음에 segment tree를 이용해, 배열에 공통적인 변화량을 기록했다. 하지만, 이후에 주어진 범위 내에서 최대 값을 구해야되는 문제가 나왔다. 범위 내의 최대값을 구하기 위해서는 결국 segment tree의 모든 leef node를 탐색해야되므로 O(n)이 걸린다. 해결 방법 배열을 n개의 그룹으로 나누어서 공통적인 변화량을 기록한다. 배열의 크기는 n^(0.5)가 된다. 이렇게 하면 값을 수정할 때도 O(n^(0.5)) 가 걸리고, 최대값을 구할 때도 O(n^(0.5))의 시간 복잡도로 탐색을 하게된다. 참고 자료 https://kesakiyo.tistory.com/22

2024-09-15 · 1 min · 66 words

SQL에서 JOIN ~ ON과 WHERE 의 실행 순서

SQL문을 실행하면 일반적으로 아래와 같은 순서로 진행된다고 일고 있을 것이다. 1. FROM 2. ON 3. JOIN 4. WHERE 5. GROUP BY 6. WITH CUBE or WITH ROLLUP 7. HAVING 8. SELECT 9. DISTINCT 10. ORDER BY 11. TOP 하지만 이것은 논리적 처리 순서이다. SQL 문을 실행시키면 쿼리 옵티마이저가 인덱스를 사용할 수 있도록 JOIN과 WHERE의 순서를 바꿔서 처리한다. 실제 처리 순서와 논리적 순서가 다르다는 것을 이해할 필요가 있다. SELECT programmer.exercise, count(1) as count FROM hospital INNER JOIN covid ON covid....

2024-09-15 · 1 min · 128 words

SQL 튜닝 전에 알아야 될 용어

MySQL 구조 MySQL의 SQL 튜닝을 하기 전에 MySQL가 어떤 구조로 동작하는지 알 필요가 있다. MySQL Connectors를 통해 SQL문을 보내게되면 간략히 아래와 같은 과정을 거친다. Parser를 통해 MySQL 엔진에서 문법 에러가 있는지, DB에 존재하는 테이블을 대상으로 SQL문을 작성했는지 검사한다. Optimizer를 통해 요청한 데이터를 빠르고 효율적으로 찾아가는 전략적 계획을 만든다. 계획을 토대로 스토리지 엔진에 위치한 데이터를 찾는다. 찾은 데이터에서 불필요한 부분을 필터링하고 필요한 연산을 수행한 뒤에 사용자에게 반환한다. 스토리지 엔진 InnoDB, MyISAM, Memory 등과 같은 스토리지 엔진은 사용자가 요청한 SQL 문을 토대로 DB에 저장된 디스크나 메모리에서 필요한 데이터를 가져오는 역할을 한다....

2024-09-15 · 6 min · 1082 words