java

    [Java] String + null

    Java에서 String 타입과 null에 대해 '+' 연산을 수행하면 어떻게 될까?System.out.println("123" + null);// 결과123nullNPE가 발생할줄 알았는데, 123null이 출력된다..? 그 이유는 자바 doc을 보면 알 수 있다. If an operand of type String is null, then the string "null" is used instead of that operand. -> 어느 한 피연산자가 null이면 해당 피연산자 대신 문자열 "null"이 사용된다는 뜻이다. 만약 특정 문자열에 null이 더해질 때 NPE를 발생시키고 싶다면 String.concat() 메서드를 사용하면 된다."123".concat(null)null.concat("1..

    [Java] Suppressed Exception

    ✅ Suppressed ExceptionSuppressed Exception은 throw되지만 무시되는 예외를 말한다.예를 들어, try-catch-finally 문에서 try문에서 예외가 발생했을 때, catch문에서 예외를 받아 throw한 상황에서,finally 문에서도 예외가 발생했다면, try문에서 발생한 예외는 무시(suppressed)된다.'무시'된 예외는 실제로 throw되지 않아, stacktrace에 찍히지 않는다.-> 잘 이해가 안될 수 있는데, 다음 예제를 통해 더 자세하게 알아보자. ✅ try-catch-finally문에서 Suppressed Exceptionpublic static void demoSuppressedException(String filePath) throws IO..

    [Java] Comparator와 @FunctionalInterface

    함수형 인터페이스 공부하다가, Comparator 인터페이스 @FunctionalInterface 애노테이션이 붙은 것을 확인했다. @FunctionalInterface public interface Comparator { int compare(T o1, T o2); boolean equals(Object obj); ... } 해당 애노테이션은 Comparator가 함수형 인터페이스라고 명시하는 것이다. 그러나 함수형 인터페이스는 추상 메서드가 한 개여야 한다. 근데 Comparator는 위와 같이 추상 메서드가 두개다. -> 왜 Comparator를 함수형 인터페이스로 명시한걸까하는 의문이 들었다. 찾아보니, 모든 클래스는 Object 클래스를 상속받데, 만약 아무 것도 상속받지 않은 클래스가 있으면 ..

    [Java] public class

    자바에서 하나의 .java 파일에 여러 class를 만들 수 있지만, public class는 파일명과 동일한 이름의 클래스 하나만 만들 수 있다. ex) Member.java public class Member { } class Id { } class Name { } 하나의 자바 파일에 여러 클래스를 작성하는 경우에, 하나의 public(대표) class를 파일명과 동일하게 하는 것이 코드의 가독성에 도움이 된다고 한다. (자바를 만든 제임슨 고슬링이 이렇게 하라고 함..) +) 만약 public class의 클래스 이름이 파일명과 다르면 컴파일 오류가 발생한다. 참고로 Kotlin의 경우, 하나의 파일에 여러 class를 선언할 수 있고, 파일명과 꼭 맞출 필요도 없다. ex) Member.kt cl..

    [Spring] ControllerAdvice - 예외 처리

    개발을 하다 보면 예상 못한 예외가 발생하거나, 또는 예상 가능한 예외를 처리해줘야 하는 경우가 있다. 이처럼 여러 상황에서 발생할 수 있는 예외를 나만의 방식으로 처리하고 이를 response 형태로 반환하는 방법을 알아보자. ControllerAdvice @ControllerAdvice는 @Controller가 붙은 클래스, 즉 컨트롤러 전역에서 발생할 수 있는 예외를 잡아 처리해주는 애노테이션이다. 만약 서비스 로직에서 예외가 발생해도 상위 메서드를 타고 올라가면서 이를 호출한 컨트롤러 계층까지 예외가 넘어가게 되는데, 개발자가 해당 예외를 따로 처리해주지 않으면 인터셉터, 필터를 거쳐 WAS 영역까지 가서 예외를 터뜨리게 된다. @ControllerAdvice는 컨트롤러에서 발생한 예외를 붙잡아 ..

    [Spring] @SpringBootTest vs @DataJpaTest

    단위테스트를 작성 간에 두 애노테이션 모두 사용해보면서 알게 된 내용을 기록한다. @SpringBootTest @SpringBootTest는 ApplicationContext(스프링 컨테이너)의 모든 Bean들을 등록한다. 즉 스프링 부트를 사용해 테스트를 한다는 말인데, 1. 쉽게 말해 @Configuration을 통해 수동으로 등록한 Bean들과, 2. 컴포넌트 스캔을 통해 @Component가 달려있는 모든 Bean들을 등록한다는 뜻이다. 설정 파일의 경우 test 폴더 내에 application.yml을 사용한다. 만약 test 폴더 내에 따로 설정 파일을 지정하지 않았다면, 기본 java 폴더 내에 application.yml 설정을 따른다. datasource는 in-memory, 로컬, 외부..

    Mockito

    Mockito Mock: 진짜 객체와 비슷하게 동작하지만 프로그래머가 직접 그 객체의 행동을 관리하는 객체. Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다. Mock 프레임워크 중 가장 많이 사용된다. 단순한 로직의 단위 테스트는 간단하게 할 수 있지만, 만약 애플리케이션이 DB를 사용한다던가 외부 API를 호출한다고 하면, DAO 객체나 외부 API가 어떻게 동작하는지 Mock을 사용해 실제 API 호출 없이 사전에 테스트를 해볼 수 있다. 라이브러리 추가 스프링 부트 2.2+ 프로젝트 생성시 spring-boot-starter-test에서 자동으로 Mockito를 추가해 준다. 스프링 부트를 쓰지 않는다면, 의존성을 직접 추가한다. org.mockito mock..

    [JPA] column default value 넣기

    [JPA] column default value 넣기

    목표: JPA를 통해 엔티티를 save 할 때, 특정 필드에 따로 값을 넣지 않아도 default value가 저장되도록 설정하자. 타겟 컬럼: usage_status → 해당 데이터에 대한 사용 여부 (YES or NO) @ColumnDefault @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id", nullable = false)\ private Long id; @Column(nullable = false) priv..