일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Redis
- request
- http
- 인터셉터
- spring boot
- java
- 트랜잭션
- Spring
- exception
- 디자인패턴
- proxy pattern
- aop
- 객체지향프로그래밍
- Interceptor
- 스프링
- 스프링 시큐리티
- network
- 자바
- Filter
- 관점지향프로그래밍
- Spring Security
- aspect
- response
- MYSQL
- OOP
- 스프링부트
- RestControllerAdvice
- git
- mybatis
- SQL
- Today
- Total
목록java (22)
장쫄깃 기술블로그
printStackTrace()를 사용하면 안되는 이유1. 오류 출력 대상의 불확실성'System.err'는 'System.setErr()'를 통해 재설정될 수 있으므로, 오류 출력이 실제로 어디로 가는지 확실하지 않다. 이는 로그가 예상치 못한 위치로 출력되어 디버깅 및 문제 추적을 어렵게 만들 수 있다. 2. 높은 오버헤드printStackTrace는 내부적으로 동기화(synchronized)를 사용하며, 성능 저하를 유발할 수 있다. 3. 보존 정책 부재printStackTrace로 출력된 로그는 별도의 보존 정책을 설정할 수 없다. 기본적으로 로그는 응용 프로그램의 생명 주기와 함께 소멸하며, 파일 저장이나 전송, 필터링이 불가능하다. 이는 중요한 오류 로그가 손실될 가능성을 높인다. 4. 보안성..
객체지향 생활 체조의 9가지 원칙1. 한 메서드에 오직 한 단계의 들여쓰기만 한다.한 메소드에 여러 들여쓰기가 존재하면, 해당 메소드는 여러 가지 일을 처리한다고 봐도 무방하다. 그리고 이는 곧 코드를 분리해야 할 때가 되었음을 의미한다. 해당 원칙을 지키기 위해 코드를 각각의 책임과 역할에 따라 분리하면 자연스럽게 가독성과 유지보수에 용이한 코드를 작성할 수 있다.AS-ISprivate void test() { testRepository.save( Test.builder() .name("test") .age(20) );}TO-BEprivate void test() { testRepository.save(createTest());}pri..
들어가며Add a private constructor to hide the implicit public one 유틸리티 클래스(UtilClass)를 만들다 보면 sonar에서 위와 같은 경고 문구를 보여주는 경우가 있다. 영문 그대로 해석해 보면 public 생성자를 숨기기 위해 private 생성자를 추가하라고 한다. 실제로 private 생성자를 추가하면 경고가 사라진다. 이 경고는 왜 발생하고, 어떻게 해결해야 하는지에 대해 알아보도록 하겠다. 유틸리티 클래스란? 유틸리티 클래스는 보통 객체 상태를 가지지 않고, 공용(static) 메소드를 제공하여 여러 곳에서 재사용할 수 있는 기능들을 모아놓은 클래스를 말한다. UtilityClasspublic class UtilityClass { pub..
Record란?record는 자바 14에서 처음 소개된 이후 16에서 정식으로 채용된 새로운 클래스 타입이다. 기존의 클래스와 비슷하지만, 더 간결하고 효율적으로 데이터 객체를 생성할 수 있도록 설계되었다. 특히, record는 보일러 플레이트 코드가 가지는 단점을 극복하기 위한 자바의 기능 중 하나이다.보일러 플레이트 코드 (Boiler Plate)여러 곳에서 재사용되며, 반복적으로 비슷한 형태를 띠는 코드ex) getter, setter, toString, equals, hashCode 등 보일러 플레이트 코드를 lombok이나 IDE의 도움을 받아 해결할 수 있지만, 근본적인 해결책은 되지 못한다. 이러한 한계를 극복하기 위해 자바가 추가한 기능 중 하나가 바로 record이다. Record의 특징..
Java Thread 종류 Main Thread Java 프로그램이 시작될 때 자동으로 생성되는 Thread 모든 Java 어플리케이션은 최소한 하나의 Main Thread가 존재 User Thread 개발자가 직접 생성하는 Thread Thread 클래스를 이용하여 생성 Daemon Thread 다른 일반 Thread의 작업을 돕는 보조적인 역할을 수행하는 Thread 단, 해당 스레드가 시작( start() )되기 전 setDeamon(true)로 데몬 스레드 지정 다른 실행중인 일반 Thread가 없거나, 모든 User Thread가 종료될 때 자동으로 종료되는 스레드 대표적으로 가비지 컬렉션 (Garbage Collection) 이 있음 Non-Daemon Thread User Thread와 같은..
들어가며 Spring 에서는 Annotation 사용에 대한 기능을 많이 제공하고 있다. @Controller, @Service, @Component, @Repository 등 많은 Annotation이 존재한다. 해당 Annotation은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 이러한 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어지고 있다. 하지만 이러한 Annotation에 대해 불필요한 내용이 포함되거나 새롭게 필요한 내용이 있는 경우 Custom을 하기도 한다. 그 중 주로 사용되는 @Target과 @Retention에 대해 알아보도록 하겠다. Meta-Annotation meta-annotation은 다른 annotation 에서도 사용되는 annotatio..
들어가며 @Autowired는 Component Scan + @Component로 스프링 빈에 등록된 객체를 찾아서 필요한 의존관계를 설정한다. (우선적으로, 타입(Type)으로 해당 빈(Bean)을 찾는다.) 만약 @Autowired를 통한 자동 의존관계 주입 시 여러개의 빈이 존재한다면 어떻게 될까? 어떤 빈을 의존주입을 해야할 지 판단하지 못하는 경우 UnsatisfiedDependencyException 이 발생한다. UnsatisfiedDependencyException은 예외명에서도 알 수 있듯이 스프링 빈 객체들이 생성되는 과정에서 의존주입을 하게 되는데, 필드에 해당하는 의존관계를 만족시킬 수 없을 때 발생하는 예외이다. 그 중에서 대표적으로 NoUniqueBeanDefinitionExce..
들어가며 Java에서 문자열을 다루는 대표적은 클래스로 String, StringBuffer, StringBuilder 가 있다. 연산이 많지 않을때는 특별한 이슈가 발생할 가능성이 거의 없다. 하지만 연산횟수가 많아지거나 멀티스레드, 경쟁 상태(Race Condition) 등의 상황이 자주 발생하면 각 클래스의 특징을 이해하고 상황에 맞는 적절한 클래스를 사용해야 한다. String, StringBuffer, StringBuilder의 기본적이니 차이는 String은 불변(Immutable), StringBuffer와 StringBuilder는 가변(Mutable) 이다. 1. String String 객체는 한번 생성되면 할당된 메모리 공간이 변하지 않는다. concat 메소드 또는 + 연산자를 통해..
Connection과 Connection Pool DriverManager.getConnection()은 실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드이다. Connection은 네트워크 상의 연결 자체를 의미한다. 보통 Connection 하나당 트랜잭션 하나를 관리한다. 트랜잭션은 하나 이상의 쿼리에서 동일한 Connection 객체를 공유하는 것을 의미한다. Connection Pool이란 클라이언트의 요청 시점에 Connection을 연결하는 것이 아니라 미리 일정수의 Connection을 만들어놓고 필요한 어플리케이션에 전달하여 이용하는 방법이다. JDBC Framework에서 close가 이루어지면 Connection을 Connection Pool에 반납하게 된다. Con..
String Constant Pool 흔히 new 연산자로 String 객체를 생성하지 않는 것이 좋다는 말을 볼 수 있다. String literal로 생성하면 해당 String 값은 Heap 영역 내 "String Constant Pool"에 저장되어 재사용되지만, new 연산자로 생성하면 같은 내용이라도 여러 개의 객체가 각각 Heap 영역을 차지하기 때문이다. 그림으로 살펴보자. String literal로 생성한 객체는 String Pool 영역에 들어간다. String literal로 생성한 객체의 값이 이미 String Pool에 존재한다면, 해당 객체는 String Pool의 reference를 참조한다. 그림에서 s1과 s2가 같은 곳을 바라보는 이유도 이 때문이다. new 연산자로 생성..