일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 카카오
- 알람 시스템
- 백준
- 코드 계약
- 셀러리
- AWS
- 좋은 코드 나쁜 코드
- 객체지향패러다임
- 검색어 추천
- 숫자 블록
- 레디스 동시성
- 쿠키
- docker
- 디버깅
- branch 전략
- gRPC
- spring event
- 트랜잭샨
- piplining
- prg 패턴
- BFS
- 깊게 생각해보기
- 구현
- 프로그래머스
- 이분탐색
- 수신자 대상 다르게
- 완전탐색
- 결제서비스
- 누적합
- jwt 표준
- Today
- Total
목록개발/Java (22)
코딩관계론
영속성 컨텍스트란 영속성 컨텍스트는 논리적인 개념으로, 영속성 엔티티들의 집합을 의미합니다. JPA에서는 EntityManager를 통해 영속성 엔티티들이 데이터베이스에 반영됩니다. 영속성 컨텍스트를 사용하는 이유는 1차 캐시 ,동일성 보장, 트랜잭션, 변경 감지 , 지연 로딩 장점을 가질 수 있기 때문입니다. 이런 장점들에 의해서 객체 관리가 쉬워지고, DB 로직이 트렌젝션 단위로 실행되게 됩니다.Entity와 EntityManager란Entity: 테이블에 매핑되는 자바 클래스를 의미합니다.EntityManager: JPA에서 영속성 컨텍스트를 관리하며, 영속성 컨텍스트에 있는 엔티티들을 데이터베이스에 저장해주는 역할을 합니다. EntityManager는 엔티티의 생명주기를 관리하고, 트랜잭션을 통..
AOP의 필요성AOP(Aspect-Oriented Programming)는 주요 기능과 부가 기능을 효과적으로 분리하고 관리할 수 있는 개념으로, 여러 클래스에 걸쳐 공통적으로 나타나는 부가 기능을 모듈화하여 코드의 중복을 줄이고 유지보수를 용이하게 합니다. AOP가 필요한 이유와 등장 배경을 좀 더 구체적으로 설명하면 다음과 같습니다.1. AOP의 필요성서비스를 구현할 때, 우리는 다음과 같이 두 가지로 나눌 수 있습니다:핵심 기능: 애플리케이션의 주요 로직을 담당하는 부분입니다. 예를 들어, 주문 시스템에서는 주문 생성, 결제 처리 등이 핵심 기능에 해당합니다.부가 기능: 핵심 기능을 지원하는 공통 기능들입니다. 예를 들어, 로깅, 보안, 트랜잭션 관리 등이 부가 기능에 해당합니다.핵심 기능과 부가 ..
1. 생성자 주입의존관계 주입에는 여럭가지 방법이 있지만 생성자 주입을 선택하는 것이 베스트라고 한다. 그 이유는 아래와 같이 요약할 수 있습니다. 1. 단 한번만 호출되는 보장생성자는 객체가 생성될 때 단 한번만 호출되며, 누군가가 생성자 변수를 강제로 변경할 수 없게 된다. 이러한 특성은 객체의 일관성과 안정성을 보장한다. 특히, 생성자 변수에 final 키워드를 설정하면, 초기화가 누락될 경우 컴파일 오류가 발생하므로 초기화의 정확성을 높일 수 있다. 2. 객체지향적 설계객체지향적 관점에서는 객체가 생성될 때 의존관계를 주입하는 것이 바람직하다. 이는 객체가 생성될 때 그 동작을 결정짓는 요소들을 함께 설정하는 것이기 때문이다. 예를 들어, 자동차를 조립할 때 엔진과 바퀴를 처음부터 조립하는 것과 ..
제어의 역전 IoC(Inversion of Control)제어의 역전은 객체 지향 프로그래밍에서 객체의 제어권을 개발자가 아닌 프레임워크나 컨테이너가 갖는 디자인 패턴입니다. 이 패턴을 사용하면 개발자는 자신의 로직을 작성하고, 그 로직의 실행 흐름은 프레임워크나 컨테이너가 관리합니다 예를 들면 아래와 같은 코드를 개발자가 작성했다고 하면 createOrder 함수의 실행주기는 개발자가 정하는 것이 아니라, 프레임워크가 결정하게 되는 것입니다. 또한 memberRepository, discountPolicy와 같은 인터페이스들도 프레임워크가 무엇을 객체화하는지에 따라서 달라지게 됩니다. 이러한 설정을 개발자가 담당하는 것이 아니라 프레임워크가 담당하게 되면 제어가 역전됐다고 합니다. public ..
팩토리 패턴을 사용하는 이유팩토리 패턴은 객체 생성 로직을 클라이언트 코드에서 분리하여, 객체 생성의 책임을 클라이언트가 아닌 별도의 팩토리 클래스에서 담당하도록 하는 디자인 패턴입니다. 이를 통해 객체 생성의 세부 사항이 클라이언트 코드에 노출되지 않고, 코드의 유연성과 확장성이 증가하게 됩니다. 팩토리 패턴 구현 방법1. 객체 생성 방법에 대한 Interface를 제공 - Creator Interfacepackage org.example.factory;public interface ShipFactory { default Ship orderShip(String name, String email){ prepareOrder(name); Ship ship = createShip..
어댑터 패턴을 사용하는 이유클라이언트가 사용하는 인터페이스와 내가 사용하는 인터페이스가 서로 다를 때, 이 두 인터페이스를 연결하여 호환성을 확보하기 위해 어댑터 패턴을 사용합니다. 특히, 오래된 코드나 타사 라이브러리를 새로운 시스템에 통합할 때 유용합니다. 어댑터를 통해 레거시 코드의 인터페이스를 변경하지 않고도 새로운 시스템과 통합할 수 있습니다.클래스 설명어댑터 패턴의 구조는 아래의 그림과 같다. 클라이언트 코드가 의존하는 인터페이스를 어댑터가 어뎁티를 이용해 구현해줌으로써 3rd-party가 제공한 기능을 커스텀하여 사용할 수 있게 된다.어댑터 패턴 구현 방법을 소개하기 전에 어떤 클래스가 클라이언트가 의존하는 클래스인지, 어떤 클래스가 Adaptee인지 설명하겠습니다.클라이언트가 의존하는 인터..
싱글톤 패턴을 사용하는 이유웹 애플리케이션은 일반적으로 여러 고객이 동시에 request 요청을 보낸다. 만약 우리가 각 요청마다 새로운 Service 객체와 Controller 객체를 생성하고, 이러한 객체들이 Garbage Collector에 의해 소멸된다면 이는 자원의 낭비를 초래할 수 있다. 따라서 객체를 미리 생성하고, 이 객체를 공유하는 방식으로 사용하게 된다면 사용자의 요청과 상관없이 하나의 객체만 사용자의 요청을 처리하게 될 것이다. 이러한 비효율성을 해결하기 위해 싱글톤 패턴이 등장하게 되었다.싱글톤 패턴 구현 방법1. 객체 생성자를 private로 선언하자싱글톤은 객체를 하나만 생성하기 때문에 다른 곳에서 싱글톤 객체를 생성하지 못하게 해야 한다. 이를 위해 생성자를 private로 ..
클러스터링클러스터링이랑 군집화를 의미한다. 즉 물리적인 디스트크에 어떤 기준으로 데이터들이 군집되어 있다는 것을 말하는데 PK를 기준으로 클러스터링 인덱스를 자동으로 생성됩니다. 이 클러스터링은 테이블당 하나만 생성됩니다. 이는 당연한 것으로 물리적으로 정렬되기 때문입니다. 또한 항상 디스크에 정렬된 상태로 존재하기 때문에 데이터의 추가, 삭제, 업데이트 시 물리적으로 정렬하는 과정을 커쳐야 하기 때문에 성능 저하의 이슈가 될 수 있습니다. 클러스터링의 동작 방식은 배열의 삽입 연산과 동작이 같습니다. 따라서 최악의 경우에는 O(n) 성능으로 동작하게 됩니다.만약 UserTable에 데이터가 아래의 그림과 같이 존제하고, "aaaa@naver.com, testuser1"을 넣어야 한다면 어떻게 동작하게..
DB Connection PoolDB Connection Pool은 웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가 필요한 시점에 연결이 아닌 이 풀에서 객체를 전달하는 방식을 의미한다. 이를 통해 애플리케이션의 성능을 향상시키고, 자원 관리를 효율적으로 할 수 있다.DB Connection Pool이 필요한 이유는?네트워크 연결 비용 감소: 네트워크를 통해 DB에 접속하게 된다. 이 네트워크는 TCP/IP 기반으로 동작하기 때문에 네트워크가 연결을 수립하기 전에 3-way handshake를 맺어야 한다. 이 과정은 추가적인 비용이 발생하며, 사용자 입장에서는 지연 시간이 생기기 때문에 애플리케이션의 사용 경험에 부정적인 영향을 미친다..
JDBC(Java Database Connectivity)는 자바를 통해 데이터베이스에 접근할 수 있도록 해주는 API입니다. 이 API는 자바 응용 프로그램과 데이터베이스 사이의 연결을 관리하고 쿼리를 실행하며 결과를 처리할 수 있도록 표준 인터페이스를 제공합니다왜 JDBC 표준 API가 필요했을까?JDBC 표준 API가 필요했던 이유는 벤더사마다 기능 구현이 달라질 경우, 데이터베이스를 변경할 때마다 코드 수정을 해야 하는 번거로움을 방지하기 위해서입니다. JDBC는 다양한 데이터베이스 벤더의 드라이버를 추상화하여 일관된 방식으로 데이터베이스에 접근할 수 있게 해줍니다. 이를 위해 자바 진영에서는 Driver 인터페이스를 제공하고, 각 벤더사에서 해당 Driver를 구현하여 라이브러리로 배포하게 됩니..
JSP 어떻게 Servlet으로 변환되서 Client에게 전달되는지를 알기 위해서는 was가 무엇인지, 서블릿이 무엇인지, 서블릿 컨테이너가 무엇인지를 알고 있어야 이해하기 쉽다. 따라서 해당 개념을 먼저 설명한 후 JSP가 어떻게 변환되는지 설명하겠습니다. 1. 웹 요청과 Tomcat먼저, 우리가 웹 브라우저에서 어떤 페이지를 요청하면, 그 요청은 패킷이라는 작은 데이터 묶음으로 서버에 전달됩니다. 이 패킷을 이해하고 처리하는 프로그램이 필요합니다. 이 프로그램을 WAS(웹 애플리케이션 서버)라고 부르는데, 자바에서는 Tomcat이라는 프로그램이 주로 사용됩니다. 웹 요청을 받는 Tomcat은 크게 두 가지 역할이 있습니다웹 서버: 요청을 받아서 정적 파일을 보내주는 역활서블릿 컨테이너: 요청을 받아서..
먼저 자바의 Map Obejct에 대해서 간단히 설명하자면 특정 key를 넣었을 때 저장된 value를 돌려주는 자료구조이다. 상속관계는 아래와 같다.HashMap 구조도HashMap 클래스에는 버킷이라고 불리는 배열이 존제하고, 해당 버킷에 노드가 들어가는 형식이 된다. 이 노드는 연결리스트로 구현되어 있지만 노드가 일정 개수(기본:8)이상이 되면 tree 노드로 변환된다HashMap의 put()기본적으로 구현된 코드는 아래와 같다. 먼저 key 오브젝트의 hascode를 호출해서 버켓 배열의 인덱스를 정하게 된다. 그 후 해당 버켓에 노드가 없으면 지금의 key, value로 하는 노드를 생성해서 배열에 저장해준다. 만약 노드가 있다면 hashcode와 equals함수를 통해서 값 비교를 진행하고 완..