유쨈미 2024. 7. 4. 12:17

1. DBCP(DataBase Conncetion Pool)

DBCP는 데이터베이스 연결을 효율적으로 관리하기 위한 기술이다. 데이터베이스 연결을
생성하고 닫는 작업은 비용이 많이 들기 때문에, Connection Pool은 이 문제를 해결하기 위해 사용된다.

 

💡주요 특징

  1. 미리 일정 수의 데이터베이스를 생성하여 Pool에 보관한다.
  2. 애플리케이션이 연결을 요청하면 풀에서 사용 가능한 연결을 제공한다.
  3. 사용이 끝난 연결은 다시 풀로 반환되어 재사용된다.
  4. 최소 및 최대 연결 수, 유휴 연결 제거 등의 설정이 가능하다.

 

💡 장점

  1. 연결 생성 및 해제 오버헤드 감소
  2. 리소스 사용 최적화
  3. 애플리케이션 성능 향상

 

📌 요약

클라이언트와 서버 사이드인 웹 애플리케이션에서 사용자의 요청에 따라 Connection이 생성된다면 수많은 사용자가 요청을 했을 때 서버에 과부하가 걸리게 된다. 이러한 상황을 예방하기 위해 미리 일정 개수의 Connection 객체를 만들어 Pool에 저장을 하고, 사용자의 요청이 발생하면 Connection을 제공하고 사용자와의 연결이 종료된다면 Pool에 다시 반환하여 보관하는 것을 의미한다.

 

DBCP(DataBase Conncetion Pool), 커넥션풀 이란?

📎 DBCP(DataBase Connection Pool) 안녕하세요, 이번에 정리할 내용은 DBCP(데이터베이스 커넥션 풀) 입니다. 클라이언트와 서버 사이드인 웹 어플리케이션에서, 사용자의 요청에 따라 Connection이 생성된

zzang9ha.tistory.com

- 출처 : zzang9ha

 

DB 커넥션 풀(DBCP)은 왜 쓰는가?

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가,클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저

velog.io

- 출처 : devdo.log


2. 람다식 map()

Java8에서 도입된 함수형 프로그래밍 기능 중 하나이다.
Stream API와 함께 사용되며, 컬렉션의 각 요소를 변환하는 데 사용된다.

 

💡 특징

  1. 함수형 인터페이스 Function<T, R>을 사용한다.
  2. 함수는 각 요소를 입력으로 받아 새로운 요소를 출력한다.
  3. 중간연산자로, 다른 스트림 연산과 체이닝이 가능하다.
  4. 원본 스트림을 변경하지 않고 새로운 스트림을 생성한다.

 

💻 예시 코드

 

1️⃣ 객체 변환

List<User> users = Arrays.asList(new User("Alice", 25), new User("Bob", 30));
List<String> names = users.stream().map(User::getName).collect(Collectors.toList());

 

2️⃣ 중첩 map 사용

List<List<String>> nestedList = Arrays.asList(Arrays.asList("a", "b"), Arrays.asList("c", "d"));
List<String> flatList = nestedList.stream().flatMap(List::stream).map(String::toUpperCase).collect(Collectors.toList());

 

3️⃣ 조건부 매핑

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<String> result = numbers.stream().map(n -> n % 2 == 0 ? "even" : "odd").collect(Collectors.toList());

 

📌 자주 사용되는 메소드

메소드 설명 예시
String::toUpperCase 문자열을 대문자로 변환 stream.map(String::toUpperCase)
String::toLowerCase 문자열을 소문자로 변환 stream.map(String::toLowerCase)
String::trim 문자열의 앞뒤 공백 제거 stream.map(String::trim)
Integer::parseInt 문자열을 정수로 면환 stream.map(Integer::parseInt)
Double::parseDouble 문자열을 실수로 변환 stream.map(Double::parseDouble)
Object::toString 객체를 문자열로 변환 stream.map(Object::toString)
Class::getName 클래스의 이름을 반환 stream.map(Class::getName)
List::size 리스트의 크기를 반환 stream.map(List::size)
Map::entrySet 맵의 엔트리 세트를 반환 stream.map(Map::entrySet)
Function.identity() 입력값을 그대로 반환 stream.map(Function.identity())
x -> x * 2 숫자를 2배로 증가 stream.map(x -> x * 2)
x -> new SomeObject(x) 새 객체 생성 stream.map(x -> new SomeObject(x))

 

 

[lambda] forEach(), map(), filter(), reduce()

java8에 추가된 lambda식에 보면 자바스크립트의 ES6의 배열 메서드들과 유사한 메서들이 존재한다. forEach() : 리스트를 순회한다. map() : 가공해서 반환할 수 있다. filter() : 필터링한 값을 반환 한다.

likejirak.tistory.com

- 출처 : likejirak


3. FormBean과 DTO의 차이

1️⃣ FormBean

  1. 주로 웹 애플리케이션에서 사용자 입력을 캡슐화한다.
  2. HTML 폼 데이터를 Java 객체로 매핑한다.
  3. 주로 웹 프레임워크(ex : Struts) 사용한다.
  4. 폼 유효성 검사 로직을 포함할 수 있다.

 

💻 예시 코드

public class LoginFormBean {
    private String username;
    private String password;

    public boolean validate() {
        return username != null && !username.isEmpty() 
               && password != null && password.length() >= 8;
    }

    // getters and setters
}

2️⃣ DTO(Data Transfer Object)

  1. 계층 간 데이터 전송을 위해 사용한다.
  2. 비즈니스 로직을 포함하지 않는 순수한 데이터 컨테이너이다.
  3. 네트워크 통신 시 데이터 직렬화에 사용한다.
    (ex : JSON 변환)
  4. 여러 계층에서 사용이 가능하다.
    (ex : 서비스 계층, 데이터 엑세스 계층)

💻 예시 코드

public class UserDTO implements Serializable {
    private Long id;
    private String name;
    private String email;

    // constructors, getters, and setters
}

 

📌 주요 차이점

  1. 사용 목적
    FormBean은 사용자 입력 처리, DTO는 데이터 전송에 사용한다.

  2. 범위
    FormBean은 주로 웹 계층, DTO는 여러 계층에서 사용한다.

  3. 포함 내용
    FormBean은 유효성 검사 로직이 포함 가능하지만 DTO는 순수 데이터만 포함할 수 있다.

  4. JNDI (Java Naming and Directory Interface)
    JNDI는 Java 애플리케이션에서 이름 지정 및 디렉터리 서비스에 접근할 수 있게 해주는 API이다.

 

💡 주요 기능

  1. 네이밍 서비스
    객체를 이름과 연결하고 이름으로 객체를 찾을 수 있다.

  2. 디렉터리 서비스
    객체의 속성을 저장하고 검색할 수 있다.

 

🚀 사용 사례

  1. 데이터베이스 연결 정보 검색
  2. 애플리케이션 서버의 리소스 (EJB, DataSource 등) 검색
  3. 환경 변수 및 설정 정보 액세스
  4. 분산 시스템에서 서비스 위치 검색

 

📌 장점

  1. 애플리케이션 구성의 유연성 증가
  2. 리소스 관리 중앙화
  3. 애플리케이션 코드와 리소스 설정의 분리

4. JNDI (Java Naming and Directory Interface)

JNDI는 Java 애플리케이션에서 이름 지정 및 디렉터리 서비스에 접근할 수 있게 해주는 Java API이다.
1997년에 도입되었으며, Java EE(현재 Jakarta EE) 플랫폼의 핵심 부분입이다.

 

💡 주요 구성 요소

 

1️⃣ 네이밍 서비스 (Naming Service)

객체를 이름과 연결하고, 이름으로 객체를 찾는 기능 제공
(ex : "jdbc/myDataSource"라는 이름으로 DataSource 객체 검색)

 

2️⃣ 디렉터리 서비스 (Directory Service)

객체의 속성을 저장하고 검색하는 기능 제공
(ex : LDAP(Lightweight Directory Access Protocol) 서버 접근)

 

🚀 주요 인터페이스

  1. Context
    네이밍 서비스의 기본 인터페이스

  2. InitialContext
    JNDI 조회의 시작점

  3. DirContext
    디렉터리 서비스를 위한 확장 인터페이스

  4. Attributes
    디렉터리 항목의 속성을 나타내는 인터페이스

 

💡 JNDI의 주요 기능

  1. 객체 바인딩 (Binding)
    이름과 객체를 연결

  2. 객체 조회 (Lookup)
    이름으로 객체 검색

  3. 컨텍스트 탐색
    계층적 네임스페이스 탐색

  4. 속성 관리
    디렉터리 항목의 속성 추가, 수정, 삭제

  5. 이벤트 처리
    네이밍 또는 디렉터리 서비스의 변경 사항 모니터링

 

💡 JNDI의 장점

  1. 설정의 중앙화
    리소스 설정을 애플리케이션 서버에서 중앙 관리

  2. 코드와 설정의 분리
    애플리케이션 코드 변경 없이 리소스 설정 변경 가능

  3. 유연성
    다양한 리소스 타입 지원 (데이터소스, JMS, EJB 등)

  4. 이식성
    다른 환경으로 애플리케이션을 쉽게 이동 가능

 

💡 JNDI 사용 사례

  1. 데이터베이스 연결 풀 관리
  2. JMS(Java Message Service) 리소스 검색
  3. EJB(Enterprise JavaBeans) 컴포넌트 검색
  4. 애플리케이션 설정 정보 저장 및 검색
  5. 분산 시스템에서의 서비스 위치 검색
 

[JNDI] JNDI에 대하여

Java Naming and Directory Interfacejava에서 Naming and Directory Service를 사용할 수 있게 하는 라이브러리.각 데이터베이스에 대한 서비스를 디렉토리 형태로 등록할 수 있다.jndi name 으로 database 정보

velog.io

- 참고 : keep.logging

 

JNDI란? Java Naming and Directory Interface.

JNDI Java Naming and Directory Interface. 이름지정 및 디렉토리 서비스에서 제공하는 데이터 및 객체를 참조(lookup)하기 위한 자바 API이다. 일반적으로 자바 애플리케이션을 외부 디렉터리 서비스(DB server,

cheershennah.tistory.com

- 참고 : cheershennah