개발을 하다보면 null 값 때문에 이런저런 오류들을 마주한다. 당연히 null 값이 아닐거라고 생각해서 사용하지만 객체의 경우는 기본적으로 nullable 하므로 얼마든지 null 일 수 있다. 만일 아래와 같이 특정 함수에서 list 객체를 반환받고 해당 객체에서 첫 번째 요소를 꺼내서 활용할 때 반환 받은 값이 null일 경우 에러가 발생한다. 이는 함수를 호출하는 곳에서는 null 값이 아닌 객체를 넘겨 줄 것이라고 생각하기 때문이다. public void test() { List list = subFunction(); System.out.println(list.get(0)); } 물론 애초에 객체를 반환하는 곳 내부에서 null 값이 아닌 빈 객체를 반환하도록 처리하거나 함수를 호출하는 곳에서 ..
rabbitMQ http api를 통해서 rabbitmq의 큐 정보를 읽어오는 것을 개발하면서 Basic 인증 방식으로 rabbitmq http api 인증을 했는데 가끔 보이는 Bearer는 무엇이고 Basic이랑 무엇이 다른지, 그리고 다른 것은 없는지 궁금해져서 찾게 되었다. HTTP 인증 우선 Basic, Bearer는 http 인증 방법 들이다. 우선 http는 W3 상에서 정보를 주고 받을 수 있는 프로토콜로 보통 HTML 문서를 주고 받는데 쓰인다고 생각하면 된다. Bacis, Bearer는 http에서 제공하는 인증 방법 중 하나로 헤더(Headers)를 통해서 인증을 하는 방식이다. http 프로토콜에서 인증이 필요한 서버에 대해 인증 없이 서버에 요청 했을 시, 또는 인증 정보와 같이 ..
보통 serialize 기능을 사용한다고 하면 Jackson을 많이 사용한다. serialize는 간단하게 설명하면 객체를 byte[]로 변환해서 전송하는 것을 의미하며 여기에 압축, 암호화 등 원하는 로직이 들어가곤 한다. 반대는 deserialize로 byte[]를 받아서 객체로 변환하는 것이다. 여하튼 요지는 Jackson serializer를 많이 사용하는데, (Jackson serializer가 무엇인지는 추후 정리해보겠다.) Jackson serializer말고도 Kryo serializer라는게 있다는 것을 알게 되는 기회가 생겨서 알게 된 내용들을 정리해본다. Kryo serializer란? 빠르고 컴팩트하게 직렬화를 할 목적으로 만들어진 경량 직렬화 프레임워크이다. 아무래도 속도와 용량을..
개발을 하다보면 thread-safe 하지 않은 클래스들을 많이 마주하게 되고 그러한 클래스들을 사용할 때 ThreadLocal을 사용해서 thread-safe하게 만들어주곤 했다. 하지만 단순히 ThreadLocal을 사용하면 변수를 thread-safe하게 만들어준다라는 개념만 있었지 thread-safe가 정확히 무엇을 의미하는지, thread-safe하지 않을 경우 무슨 일이 발생하는지, ThreadLocal은 정확히 무엇이고 어떻게 동작하는지는 알지 못해 이렇게 글을 정리해본다. thread-safe란? 우선 ThreadLocal이 뭔지 이해하려면 thread-safe가 무엇인지 이해해야 한다. 가끔 라이브러리에서 가져와 사용하는 클래스들을 보면 주석으로 아래와 같이 thread-safe가 언급..
mac에 다양한 프로그램을 설치하고 사용하다보면 아래와 같은 경고 문구를 많이 본다. 여기서 경고로만 끝나면 상관 없는데 경고와 함께 해당 앱이 악성 소프트웨어일 수도 있으니 실행을 안 시켜준다. 'Apple에서 악성소프트웨어가 있는지 확인할 수 없기 때문에 열 수 없습니다.'라는 문구는 보통 정식 다운로드가 아닌 글에 첨부되어 있는 실행 파일을 실행 시켰을 때 많이 발생하는 문구로, 위의 캡처 또한 github에서 dmg 파일을 다운로드 받아 바로 실행했기 때문에 발생한 것이었다. 해당 앱에 악성이 없다고 확신된다면 아래의 방법을 통해 해당 앱을 실행시킨다. 1. 시스템 환경설정 > 보안 및 개인 정보 보호로 이동한다. 2. 보안 및 개인 정보 보호 화면에서 일반 탭의 하단을 보면 아까 발새했던 경고 ..
개발을 하다보면 특정 패턴을 가진 메소드에 대해서 공통적으로 적용해줘야하는 기능이 있다. 제일 대표적인게 바로 로그 기록이 있는데, 이와 같은 기능을 특정 패턴을 가진 메소드에 넣기 위해서는 로그를 기록하는 공통 Util 메소드를 생성하고 해당 Util 메소드를 특정 패턴을 가진 메소드에 일일이 넣는 것을 생각할 수 있다. 하지만 이렇게 수동으로 공통 기능을 넣어줄 경우 추후 코드를 수정할 곳이 많아진다거나 어디에 Util 메소드를 넣었는지 찾기가 힘들어 유지보수가 힘들어진다. 위와 같이 특정 패턴을 가진 메소드에 공통되는 위치(실행 전, 실행 후)에 있는 공통되는 기능을 횡단 관심사라고 한다. 그리고 이러한 횡단 관심사를 수동으로 구현할 필요 없이 알아서 지정한 패턴에 넣어주는 방법으로는 Spring ..
컨트롤러에서 값을 받을 때 보통 아래와 같이 'javax.validation.constraints' 제공하는 어노테이션들을 사용해서 파타미터의 값을 체크한다. @NotNull @NotEmpty 하지만 이는 단순 체크를 위한 어노테이션으로 우리가 특수한 상황에(예를 들어 파라미터로 받는 DTO의 inner DTO의 특정 필드는 null이면 안 된다든지 특정 값 내에 있어야한다든지 등) 맞춰 내가 원하는 대로 값을 체크해주지 않는다. 그래서 이와 같이 여러 가지 경우를 고려해서 값을 체크해야하는 경우 Service 단에서 파라미터 안의 값을 꺼내 예외 처리를 해주곤 하는데, constraintValidator와 custom annotation을 구현하면 아예 Controller로 데이터가 들어오기 전인 In..
https://pamyferret.tistory.com/43 Java 8부터 지원되는 Stream API 스트림(Stream)이란? FileInputStream과 같은 I/O 스트림과는 다른 개념이다. (I/O 스트림은 데이터 가져오기와 내보내기를 하는 일종의 통로 역할을 하는 것이다.) 스트림은 간단하게 한 줄로 요약하면 pamyferret.tistory.com 지난번에 Java 8부터 지원하는 Stream API에 대해 포스팅을 했었다. 모든 데이터를 다룰 때 사용하면 좋다고 포스팅을 했었는데 그렇다면 Stream API가 무조건 좋을까? for문을 사용했을 때와 Stream API를 사용했을 때의 성능 차이 Stream API에 forEach가 있어서 for문이랑 Stream API의 성능은 많이 ..
- Total
- Today
- Yesterday
- 메시지큐
- 자바
- enum
- DB
- rabbitmq
- 공간데이터
- 스프링부트
- springboot
- ssh
- JPA
- 이클립스
- Intellij
- annotation
- 캐시
- 데이터베이스
- DATABASE
- postgres
- HttpClient
- k8s
- 캐싱
- 어노테이션
- 역직렬화
- Java
- PostgreSQL
- Caching
- eclipse
- mockito
- Spring
- MAC
- cache
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |