일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- java
- 스프링
- spring boot
- network
- Redis
- 관점지향프로그래밍
- 트랜잭션
- SQL
- 자바
- exception
- request
- 디자인패턴
- 스프링부트
- response
- git
- proxy pattern
- http
- Interceptor
- Spring Security
- RestControllerAdvice
- aop
- 인터셉터
- mybatis
- aspect
- OOP
- Filter
- 스프링 시큐리티
- Spring
- MYSQL
- 객체지향프로그래밍
- Today
- Total
목록Programming Language (21)
장쫄깃 기술블로그
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와 같은..
Atomic 변수란 Atomic 변수는 원자성을 보장하는 변수이다. 멀티스레드 환경에서 동기화 문제를 해결하기 위해 synchronized 키워드를 사용하여 락을 걸곤 한다. 그런데 synchronized는 특정 스레드가 해당 블럭 전체를 lock 하기 때문에 낭비가 심하다. 이러한 문제를 해결하기 위해 고안된 방법이 Atomic 변수이다. Atomic 변수는 CAS(Compare And Swap) 알고리즘을 사용하여 NonBlocking하면서 동기화 문제를 해결할 수 있다. CAS(Compare And Swap) 알고리즘 멀티스레드 환경, 멀티코어 환경에서 각 CPU는 메인 메모리에서 변수값을 참조하는 것이 아니라, 각 CPU의 개시 영역에서 메모리를 참조하게 된다. (그림 2 참조) 이 때, 메인 메..
들어가며 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 연산자로 생성..
JVM이란? JVM이란 Java Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다. 가상머신이란 프로그램이 실행하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것 JVM은 스택 기반의 가상머신이다. ARM 아키텍쳐같은 하드웨어는 레지스터 기반으로 동작하지만, JVM은 스택 기반으로 동작한다. JVM의 역할은 다음과 같다. 자바 어플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행 Java와 OS 사이에서 중개자 역할을 수행하여 Java가 OS에 구애받지 않고 재사용을 가능하게 함 프로그램에 필요한 메모리 할당, 관리 GC(Garbage Collection) 수행 JVM 구조 Class Loader (클래스 로더) JVM내로 클래스(.class 파일..