개발을 하다보면 thread-safe 하지 않은 클래스들을 많이 마주하게 되고 그러한 클래스들을 사용할 때 ThreadLocal을 사용해서 thread-safe하게 만들어주곤 했다. 하지만 단순히 ThreadLocal을 사용하면 변수를 thread-safe하게 만들어준다라는 개념만 있었지 thread-safe가 정확히 무엇을 의미하는지, thread-safe하지 않을 경우 무슨 일이 발생하는지, ThreadLocal은 정확히 무엇이고 어떻게 동작하는지는 알지 못해 이렇게 글을 정리해본다. thread-safe란? 우선 ThreadLocal이 뭔지 이해하려면 thread-safe가 무엇인지 이해해야 한다. 가끔 라이브러리에서 가져와 사용하는 클래스들을 보면 주석으로 아래와 같이 thread-safe가 언급..
개발을 하다보면 특정 패턴을 가진 메소드에 대해서 공통적으로 적용해줘야하는 기능이 있다. 제일 대표적인게 바로 로그 기록이 있는데, 이와 같은 기능을 특정 패턴을 가진 메소드에 넣기 위해서는 로그를 기록하는 공통 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의 성능은 많이 ..
개발을 하다보면 진짜 별의별 에러를 다 마주친다. 그나마 컴파일 에러로 IDE에서 잡아주면 다행이지만 런타임 에러는 실행시켜보고 여러 가지 테스트를 해봐야 에러를 마주할 수 있고 예외 처리를 할 수 있다. 우리는 이것을 에러, 예외라고 부르며 공통적으로는 Exception이라고 부른다. 이 Exception도 두 부류로 나뉠 수 있다는 것을 이번에 알게 되었다. 또한 이 Exception 부류로 인해 기본 transaction 처리를 할 수 있게 된다. Checked Exception 외부 요인에 의해 발생할 수 있는 Exception이다. RuntimeException 자시 자신을 포함해 상속 받지 않은 모든 Exception들이 해당된다. (Exception또한 checked Exception에 해당..
개발을 하다보면 AOP 적용을 위해서 별도로 커스텀 어노테이션을 만들어야할 일이 생긴다. 물론 AOP 적용을 패턴을 통해 적용시킬 수 있지만 같은 공통 기능을 사용해야하는 메소드들에 공통점이 없다면? 커스텀 어노테이션을 만들어서 해당 메소드에 공통 기능을 사용하겠다고 표시를 해 AOP 설정을 할 수 있다. Annotation(어노테이션) 이란? 그렇다면 먼저 어노테이션이란 무엇인지 개념을 살짝 짚고 가보자. 개발을 하다보면 @Getter, @Setter 등의 어노테이션을 자연스럽게 사용하고 있다. 하지만 그래서 어노테이션이 뭔데요? 라고 누가 물어보면 설명을 잘 할 수 없을 때가 있다. 그래서 어노테이션이란 무엇인가? 간단하게 설명하면 일종의 메타 데이터를 의미한다. 해당 데이터를 바탕으로 자동으로 기능..
개발을 하다보면 String Number(int, float, double)로 형변환을 할 일이 많다. 전에는 이런 형변환을 아래와 같이 parse() 함수를 이용해서 수행했었다. String s = "3"; Integer.parseInt(s); Float.parseFloat(s); Double.parseDouble(s); s가 빈 문자가 아니라는 확신이 있다면 위 코드는 문제가 없다. 하지만 만일 빈 문자가 들어올 수도 있는 값을 Number 타입으로 변경해야한다면 아래와 같은 에러가 발생한다. String s = ""; // 또는 s 등과 같은 숫자가 아닌 문자 Integer.parseInt(s); java.lang.NumberFormatException: For input string: "" 또한 ..
처음 코딩을 할 때 자바를 다운로드 받으면서 할 수 있는 실수가 하나 있다. 바로 jdk가 아닌 jre를 다운로드 받는 실수인데, jre를 다운로드 받아도 간단한 코딩 정도는 가능하지만 계속 코딩을 하다보면 에러가 발생할 수 있다 그건 바로 jre가 아닌 jdk를 다운로드 받아서 프로젝트에 jre를 사용하겠다고 설정해놔서 생기는 에러인데, 그렇다면 jre와 jdk는 무엇이 다른걸까? (참고로 인텔리제이의 경우는 미리 jdk를 다운로드 받지 않아도 프로젝트를 생성하고 사용하면서 필요한 jdk를자동으로 다운로드 해주므로 이와 같은 에러를 마주할 일이 없다.) JRE(Java Runtime Environment)란? JRE란 번역하면 자바 실행환경으로 자바 프로그램을 실행하는데 필요한 것이다. 즉, 자바 프로..
- Total
- Today
- Yesterday
- annotation
- rabbitmq
- DB
- 캐시
- MAC
- 공간데이터
- 역직렬화
- k8s
- springboot
- 자바
- eclipse
- 어노테이션
- 메시지큐
- Spring
- HttpClient
- JPA
- cache
- Java
- 이클립스
- 캐싱
- enum
- DATABASE
- 스프링부트
- ssh
- Caching
- PostgreSQL
- postgres
- 데이터베이스
- mockito
- Intellij
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |