본문 바로가기

Java59

프록시 팩토리를 통한 AOP 프록시 팩토리 스프리에서 프록시 팩토리는 AOP(Aspect-Oriented Programming)의 핵심 개념 중 하나이다. AOP는 애플리케이션의 핵심 비즈니스 로직 외에도 보안, 로깅, 트랜잭션 관리 등과 같은 다양한 부가적인 관심사를 모듈화하고 분리하는데 사용되는 기술로 이를 통해 코드 중복을 줄이고 코드의 재사용성을 향상시킬 수 있다. 프록시 팩토리는 주로 AOP를 구현하기 위해 사용된다. 스프링은 빈(Bean)을 프록시 객체로 래핑하고, 프록시 객체를 통해 부가적인 관심사를 처리하는 방식으로 AOP를 제공한다. 따라서 클라이언트 코드에 영향을 주지 않으면서 부가적인 동작을 수행할 수 있다. 프록시가 나온 계기 런타임 환경에서 프록시 객체를 동적으로 생성하는 방법에 다음 두 가지 방법이 있다. .. 2023. 10. 16.
Auto Configuration Auto Configuration Spring Boot의 Auto Configuration은 Spring Boot 애플리케이션을 개발할 때 기본적인 설정을 자동으로 제공하는 기능이다. 덕분에 개발자가 별도의 구성 파일을 작성하거나 빈을 설정하는 번거로움을 줄여준다. 스프링 부트는 수 많은 자동 구성을 제공하고 spring-boot-autoconfigure에 자동 구성을 모아두는데 아래 사이트를 이동하면 확인할 수 있다. Auto-configuration Classes 자동 구성 확인 @Slf4j @SpringBootTest class DbConfigTest { @Autowired DataSource dataSource; @Autowired TransactionManager transactionManage.. 2023. 10. 9.
ThreadLocal을 사용하여 로깅하기 + MDCFilter ThreadLocal ThreadLocal은 Java에서 멀티스레드 환경에서 스레드 간에 데이터를 공유하지 않고 각 스레드마다 독립적으로 데이터를 보관하고 접근할 수 있게 해주는 클래스이다. 이는 하나의 스레드가 힙 메모리에서 참조하는 객체는 다른 여러 스레드에서도 참조할 수 있기 때문에 멀티스레드 환경에서 컨텍스트 스위칭이 일어남에 따라 데이터를 공유하여 발생하는 문제를 해결할 수 있다. ThreadLocal의 특징 스레드 간 데이터 분리: ThreadLocal을 사용하면 각 스레드에서 독립적으로 데이터를 관리할 수 있다. 즉, 한 스레드에서 설정한 데이터는 다른 스레드에 영향을 미치지 않는다. 초기화 및 접근: ThreadLocal 변수는 초기화될 때 기본값이나 초기값으로 설정된다. 각 스레드는 이 .. 2023. 10. 8.
스프링 예외 추상화 예외 추상화 스프링이 제공하는 예외 추상화를 이해하기 위해서는 먼저 자바 기본 예외에 대한 이해가 필요하다. 체크 예외와 언체크 예외 Object: 예외도 객체이다. 모든 객체의 최상위 부모는 Object이므로 예외의 최상위 부모도 Object이다. Throwable: 최상위 예외로 하위에 Exception과 Error가 있다. Error: 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다. 애플리케이션 개발자는 이 예외를 잡으려고 해서는 안된다. 상위 예외를 catch로 잡으면 그 하위 예외까지 함께 잡는다. 따라서 애플리케이션 로직에서는 Throwable 예외로 잡으면 Error 예외도 함꼐 잡을 수 있기 때문에 Exception부터 예외를 잡아야 한다. 참고로.. 2023. 10. 7.
스프링 트랜잭션 트랜잭션 트랜잭션은 하나 이상의 작업을 논리적인 작업 단위로 묶은 것으로, 이 작업들은 모두 성공적으로 완료되거나 실패할 수 있다. 데이터베이스 관리 시스템(DBMS)에서 특히 중요하며, 데이터베이스에서 데이터를 안전하게 조작하고 관리하기 위해 사용된다. 트랜잭션 ACID 트랜잭션의 주요 특징은 다음과 같다. 원자성(Atomicity): 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 한다. 일관성(Consistency): 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어, 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성(Isolation): 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 .. 2023. 10. 5.
커넥션풀과 데이터소스 이해하기 with HikariCP 커넥션 풀 커넥션 풀은 데이터베이스 연결을 관리하는 데 사용되는 메커니즘이다. 데이터베이스 연결을 생성하고 닫는 과정은 비용이 많이 들기 때문에 애플리케이션에서 데이터베이스와의 연결을 효율적으로 관리하기 위해 연결 풀을 사용한다. 커넥션 풀 등장배경 데이터베이스 커넥션을 획득할 때는 다음과 같은 복잡한 과정을 거친다. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.. 2023. 10. 3.
JDBC의 Connection, PreparedStatement(vs Statement) JDBC JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. JDBC가 나오게 된 배경 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 애플리케이션 서버는 다음 과정을 통해서 데이터베이스를 사용한다. 커넥션 연결: 주로 TCP/IP를 사용해서 커넥션을 연결한다. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. 하지마 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달.. 2023. 10. 3.
스프링의 내부구조 파헤치기 스프링 내부구조 Web Server Client는 HTTP 프로토콜을 이용하여 요청을 보내게 된다. 웹 서버는 이를 해석해 요청에 맞는 데이터를 보내주어야 한다. 그에 맞는 데이터 형식으로 보내주는 것이 Web Server가 할 일이다. 웹 서버는 단순히 요청에 대한 데이터를 수정없이(static, 정적) 클라이언트에게 보내주기만 하면 된다. 초창기 인터넷에서는 정적 데이터에 대한 수요가 높았기 때문에 기능적으로 WAS를 따로 나누지 않고 웹 서버라는 개념을 통칭해서 사용했다. WAS(Web Application Server) WAS는 J2EE 스펙을 구현하여, 서블릿이나 JSP로 작성된 애플리케이션을 실행하는 소프트웨어이다. 참고: J2EE(Java 2 Platform, Enterprise Editio.. 2023. 9. 25.
HTTP Request 파싱하기 HTTP Request 파싱하기 이전 게시글에서 HTTP Request가 출력되는 것을 확인했다! 그러면 이제 HTTP Request를 파싱해보자. 이렇게 HTTP Request를 파싱하는데에는 이유가 있다. 우리가 사용하는 스프링 프레임워크는 모두가 알다시피 서블릿 스펙을 지킨 서블릿 컨테이너를 구현하고 있다. 다시 말하자면 서블릿 컨테이너의 주요 목표는 서블릿을 동작시키는데 있다고 볼 수 있다. 따라서 서블릿이 어떤 방식으로 동작하는지를 이해하면 서블릿 컨테이너가 제공해야 하는 기능을 역으로 유추할 수 있다. 그리고 이런 서블릿의 목적은 HTTP 프로토콜을 사용해 웹 서비스를 제공하는 것이다. 그럼 이 서블릿 스펙을 구현한 서블릿 컨테이너는 네트워크 통신, 생명주기 관리, 스레드 기반의 병렬처리를 대.. 2023. 9. 21.