예외가 발생하지 않는지 테스트
방법 // obviously fails: assertThatCode(() -> { throw new Exception("boom!"); }).doesNotThrowAnyException(); 참고 자료 Assert that Runnable does not throw exception. · Issue #943 · assertj/assertj · GitHub
방법 // obviously fails: assertThatCode(() -> { throw new Exception("boom!"); }).doesNotThrowAnyException(); 참고 자료 Assert that Runnable does not throw exception. · Issue #943 · assertj/assertj · GitHub
목표 어떤 메서드를 호출했을 때 특정 예외가 발생하는지 테스트하는 코드를 작성한다. 어떤 메서드를 호출했을 때 아무 예외가 발생하지 않는지 테스트하는 코드를 작성한다. assertThrows assertThrows<SomeException> { service.insert(something) } Executable(함수형 인터페이스) 타입을 파라미터로 넘기면 이를 실행했을 때 SomeException이 발생하는지 검증한다. assertDoesNotThrow assertDoesNotThrow { service.insert(something) } Executable(함수형 인터페이스) 타입을 파라미터로 넘기면 이를 실행했을 때 아무 예외가 발생하지 않는지 검증한다. 참고 자료 https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html#assertDoesNotThrow(org.junit.jupiter.api.function.Executable) https://stackoverflow.com/questions/17731234/how-to-test-that-no-exception-is-thrown
https://junroot.github.io/programming/JPA-시작하기/ 에서 어느 정도 영속성 컨텍스트와 엔티티의 생명주기를 간단하게 알아봤다. 이 영속성 컨텍스트의 특징을 좀 더 자세히 알아보도록 하자. 플러시 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 이 때 영속성 컨텍스트에 보관된 엔티티를 지우는 것은 아니다. 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이다. 플러시 과정 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어서 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다....
Math.max(12.123, 12.456) 참고 자료 https://www.tutorialspoint.com/java/number_max.htm
@Embeddable public class RoomUsers { @OneToMany(mappedBy = "room") private final List<User> users = new ArrayList<>(); ... } @Entity public class Room { @Embedded private RoomUsers users; ... } @Embeddable 과 @Embedded 어노테이션을 붙이면 엔티티에 일급 컬렉션을 사용할 수 있다.
Application 클래스에 @EnableJpaAuditing 어노테이션 추가 저장하고자하는 엔티티에 @EntityListeners(AuditingEntityListener.class) 추가 참고 자료 https://stackoverflow.com/questions/40370709/createddate-annotation-does-not-work-with-mysql
문제 풀이 중 배열의 복사 과정이 빈번히 일어나는 경우가 있었다. 매번 반복문을 이용해서 복사하는 과정을 간략하게 작성할 수 있는 방법이 있을 것 같아서 정보를 찾게 되었다. 얕은 복사? 깊은 복사? 복사에 대해서 이해하기 위해서는 얕은 복사와 깊은 복사를 이해할 필요가 있다. 얕은 복사: 복사본에 원본 데이터의 포인터를 가리키도록 하는 방법이다. 상대적으로 복사가 빠르지만, 원본 데이터의 값을 수정하면 함께 값이 변하므로 유의해야 된다. 깊은 복사: 복사본에 원본 데이터의 값들을 직접 복사하는 방법이다....
if [ "$(docker ps -q -f name=<name>)" ]; then docker stop <name> docker rm <name> fi
events {} 를 추가하면 된다. 설정 해본적이 없어서 존재하는지 몰랐다. events {} http { server { # Your code here } } 참고 자료 https://stackoverflow.com/questions/54481423/nginx-startup-prompt-emerg-no-events-section-in-configuration
입력 길이에 따라 알고리즘이 처리하는 시간을 정량화한 것이다. 일반적으로 빅오 표기법을 사용한다. 빅오 표기법이란, 식의 최고 차항을 제외한 모든 항과 최고차항의 계수를 제외시킨다. 일반적으로 문제를 풀 때 시간 제한이 1초라면 시간복잡도는 다음과 같다. N범위가 500인 경우: 시간 복잡도가 O(N^3)인 알고리즘을 설계하면 풀 수 있다. N범위가 2000인 경우: 시간 복잡도가 O(N^2)인 알고리즘을 설계하면 풀 수 있다. N범위가 100000인 경우: 시간 복잡도가 O(NlogN)인 알고리즘을 설계하면 풀 수 있다. N범위가 10000000인 경우: 시간 복잡도가 O(N)인 알고리즘을 설계하면 풀 수 있다....
이를 사용하기 위해서는 mockito 의존을 새로 추가해야된다. mockito-inline 를 추가해야된다. mockito-core를 대체할 수 있다. testImplementation 'org.mockito:mockito-inline:4.2.0' 정적 메소드를 목킹하기위해서는 먼저 MockedStatic 객체를 만들어야된다. 이 객체는 AutoClosable 이기때문에 try-with-resources로 감싸는게 좋다. try-with-resource 블럭 내부에서는 목킹이 되고, 밖으로 벗어나면 적용되지 않는다. @Test void givenStaticMethodWithNoArgs_whenMocked_thenReturnsMockSuccessfully() { assertThat(StaticUtils.name()).isEqualTo("Baeldung"); try (MockedStatic<StaticUtils> utilities = Mockito.mockStatic(StaticUtils.class)) { utilities.when(StaticUtils::name).thenReturn("Eugen"); assertThat(StaticUtils.name()).isEqualTo("Eugen"); } assertThat(StaticUtils.name()).isEqualTo("Baeldung"); } @Test void givenStaticMethodWithArgs_whenMocked_thenReturnsMockSuccessfully() { assertThat(StaticUtils.range(2, 6)).containsExactly(2, 3, 4, 5); try (MockedStatic<StaticUtils> utilities = Mockito.mockStatic(StaticUtils.class)) { utilities....
기존 코드 while (bufferedReader.ready()) { ... } 이렇게 구현하니 클라이언트가 데이터를 보내기전에 여기에오면 그냥 통과해버리는 문제가 있었다. 현재 코드 while (Objects.nonNull(line = bufferedReader.readLine())) { ... } 어차피 readLine() 메소드는 다음 입력이 오기전까지 대기하기 때문에 ready() 없이 해결할 수 있었다. 참고 자료 https://stackoverflow.com/questions/19353133/block-bufferedreader-until-data-appears
응답 관련 평균 응답 시간: 사용자가 요청보내고 응답의 마지막 바이트를 받을 때까지 걸리는 평균적인 시간을 말한다. 실제 사용자 경험을 가장 잘 나타내는 수치다. 최대 응답 시간: 응답 시간 중에 가장 긴 경우를 말한다. 응답에 이상 현상을 식별할 때 사용한다. Error rate: (문제가 발생하는 요청 수)/(전체 요청 수)를 의미한다. 사용자 경험을 개선하려면 Error rate를 줄여야된다. 처리량 관련 동시 사용자(Concurrent users): 특정 시점에 활성 상태인 Virtual User의 수를 말한다. 시스템이 수용할 수 있는 유저의 수를 정할 때 사용할 수 있다....
팀 프로젝트에 성능 테스트를 진행해보기 앞서 성능 테스트의 기본 지식을 학습할 필요가 있어서 글을 작성하게 되었다. 성능 테스트? 부하 테스트? 스트레스 테스트? 성능 테스트, 부하 테스트, 스트레스 테스트. 이름만 들어서는 전부 같은 같은 말로 보였다. 하지만 실제로 표현하는 사례들을 보니 어느 정도 차이가 있었다. 성능 테스트 성능 테스트는 소프트웨어와 인프라의 속도를 테스트한다. 메모리 사용량, 네트워크 대역폭 및 처리량, 응답 시간, CPU 사용률 등의 기준을 두고 측정할 수 있다. 시스템 내에 통신 과정의 병목을 찾아내기 위해서 진행 한다....
서비스가 다른 서비스를 참조하도록 설계를 하는게 좋을지, 아니면 서비스는 다른 서비스를 의존하지 않고, 여러 개의 DAO를 가지고 오도록 하면 좋을지에 대한 고민이였다. 서비스가 다른 서비스를 가지는 경우의 장단점은 명확했다. 장점: 유효성 검사 등 비즈니스 로직의 중복 코드를 제거할 수 있다. 단점: 서비스 간의 순환 참조가 발생할 수도 있다. → 내가 내린 결론 중복 코드 제거의 장점을 가져가기 위해 서비스가 다른 서비스를 가질 수 있는 방법을 선택 순환 참조가 발생하지 않게, 서비스간의 계층을 잘 설계해야된다....
gradle의 서브 모듈 하나만 빌드하고 싶은 경우가 있었다. 아래 명령어로 원하는 서브 모듈의 빌드가 가능하다. gradlew :{서브 모듈 이름}:build 참고 자료 https://spring.io/guides/gs/multi-module/ https://stackoverflow.com/questions/16976214/gradle-build-only-one-module
301 Moved Permanently: 리퀘스트된 리소스에는 새로운 URI로 영구히 이동되었기 떄문에 이후로는 그 리소를 참조하는 URI를 사용해야된다는 뜻이다. 새로운 URI는 Location 헤더 필드에 명시되어 있다. 브라우저는 이 페이지로 리디렉션되고 리소스에 대한 링크를 업데이트 한다. 302 Found: 리퀘스트된 리소스가 새로운 URI로 일시적으로 이동했다는 뜻이다. 브라우저는 사용자를 이 URL의 페이지로 리다이렉트시키지만 리소스에 대한 링크가 업데이트 되지 않는다. 참고 자료 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301 https://developer.mozilla.org/ko/docs/Web/HTTP/Status/302
super() 를 붙이면된다. class MaxLimitCalculator(Calculator): max_limit = 100 def add(self, val): super().add(val) if self.value > self.max_limit: self.value = self.max_limit 참고 자료 https://dev-ku.tistory.com/168
많은 양의 데이터를 입력받아야 될 때 input() 함수가 느릴 수 있다. 이럴 때는 sys 라이브러리의 readline() 함수를 이용하면 된다. rstrip()은 string 오른쪽에 있는 개행 문자와 공백을 제거해주는 역할을 한다. readline()으로 입력하게 되면 문자열에 개행도 포함되기 때문이다. import sys input_data = sys.stdin.readline().rstrip() 참고 자료 https://www.delftstack.com/ko/howto/python/python-remove-newline-from-string/
-P {프로필 명} 쉼표로 구분해서 프로필을 여러개 설정할 수 있다. mvn -P profile-1,profile-2 package 참고 자료 https://maven.apache.org/guides/introduction/introduction-to-profiles.html