개발자상식 <백엔드 개발자> (10)
[책리뷰 & Book review]
커넥션 풀이란 무엇인가?
커넥션 풀(Connection Pool)은 데이터베이스와의 연결을 미리 여러 개 생성해 두고, 필요에 따라 이들을 재사용하는 기법입니다. 데이터베이스와의 연결은 비용이 큰 작업이므로, 미리 연결을 생성해 두고 필요할 때마다 재사용함으로써 성능을 향상하는 역할을 합니다.
Spring Framework와 Spring Boot에서의 커넥션 풀 설정은 코드 수준에서는 큰 차이가 없습니다. 둘 다 DataSource 객체를 생성하고 필요한 속성을 설정하면 됩니다. 하지만, Spring Boot는 '자동 설정' 기능을 통해 별도의 설정 없이도 기본적인 커넥션 풀을 제공합니다. 따라서 Spring Boot를 사용하면 훨씬 더 간단하게 커넥션 풀을 사용할 수 있습니다.
다음은 Spring Framework에서 커넥션 풀을 설정하는 예제 코드입니다:
java
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebConfig {
@Bean
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("cohttp://m.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/mydb");
ds.setUsername("user");
ds.setPassword("password");
// 커넥션 풀 설정
ds.setInitialSize(5);
ds.setMaxActive(10);
ds.setMaxIdle(5);
ds.setMinIdle(2);
ds.setValidationQuery("SELECT 1");
return ds;
}
}
반면, Spring Boot에서는 아래와 같이 간단하게 설정할 수 있습니다:
java
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=user
spring.datasource.password=password
spring.datasource.driver-class-name=cohttp://m.mysql.jdbc.Driver
# 커넥션 풀 설정
spring.datasource.tomcat.initial-size=5
spring.datasource.tomcat.max-active=10
spring.datasource.tomcat.max-idle=5
spring.datasource.tomcat.min-idle=2
구성도와 실행 동작을 텍스트 그림으로 나타내면 다음과 같습니다:
1. 애플리케이션 시작
2. DataSource 생성 및 커넥션 풀 설정
3. 데이터베이스 연결 생성 (커넥션 풀 사이즈만큼)
4. 필요에 따라 데이터베이스 연결 사용 및 반환 (재사용)
5. 애플리케이션 종료 시 데이터베이스 연결 해제
이렇게 커넥션 풀을 통해 데이터베이스 연결을 재사용하면, 매번 연결을 생성하고 해제하는 비용을 줄일 수 있습니다.
이는 특히 동시에 많은 요청을 처리해야 하는 웹 애플리케이션에서 중요한 성능 최적화 방법입니다.
커넥션 풀에 대한 api 의 상관도는?
커넥션 풀의 '비용'이란 용어는 주로 성능 측면에서의 비용을 의미합니다,
즉, CPU 사용량, 메모리 사용량, 네트워크 대역폭 등의 자원을 사용하는 것을 말합니다.
데이터베이스와의 연결을 맺는 것은 이러한 자원을 많이 사용하므로, 비용이 큰 작업이라고 할 수 있습니다. 따라서 커넥션 풀을 사용하면 이 비용을 크게 줄일 수 있습니다.
커넥션 풀이 작동하는 방식을 설명하면,
애플리케이션이 시작될 때 커넥션 풀이 생성되고, 설정된 수만큼 데이터베이스와의 연결이 미리 생성됩니다. 이 시점에서 연결을 생성하는 비용이 발생합니다.
API 호출 등으로 데이터베이스에 접근이 필요한 경우, 미리 생성해 둔 연결 중 하나를 사용합니다. 이 경우, 연결을 맺는 비용이 없이 바로 연결을 사용할 수 있으므로 비용이 절약됩니다.
연결 사용이 끝나면 연결을 끊지 않고 다시 커넥션 풀에 반환합니다. 이후에 다시 이 연결을 재사용할 수 있습니다.
이를 텍스트 그림으로 나타내면 다음과 같습니다:
1. 애플리케이션 시작
└── 커넥션 풀 생성 및 데이터베이스 연결 생성 (비용 발생)
2. API 호출
└── 커넥션 풀에서 연결 가져오기 (비용 절약)
3. 데이터베이스 작업 수행
4. 연결 반환
└── 커넥션 풀에 연결 반환 (재사용을 위해 연결 유지)
5. 애플리케이션 종료 시 연결 해제 (비용 발생)
따라서, 커넥션 풀이 한 번 연결되면 그 이후 연결을 가져다 사용하거나 반환하는 작업은 추가적인 비용 없이 이루어집니다. 이는 커넥션 풀이 핵심적인 성능 최적화 방법 중 하나입니다.
커넥션 풀에 대한 서버와 연관성
"비용"이라는 단어가 혼동을 줄 수 있을 것 같아 정리해 드리겠습니다. 여기서 말하는 "비용"은 실제로 돈이 지불되는 것이 아니라, 컴퓨터의 자원(CPU, 메모리, 네트워크 등)을 사용하는 것을 의미합니다.
데이터베이스와의 연결을 생성하거나 해제하는 작업은 컴퓨터 자원을 상당히 많이 사용합니다. 따라서 이런 작업을 반복적으로 수행하면 시스템의 성능이 저하될 수 있습니다. 이를 "비용이 크다"라고 표현합니다.
커넥션 풀은 이런 "비용"을 줄이기 위한 기법입니다. 애플리케이션 서버가 시작될 때 미리 데이터베이스와의 연결을 여러 개 생성해 두고, 이를 재사용함으로써 연결 생성/해제에 드는 비용을 크게 줄일 수 있습니다. 따라서 애플리케이션 서버를 실행하여 서버를 킬 때 커넥션 풀이 생성되고, 이후로는 이미 생성된 연결을 재사용하므로 추가적인 자원 사용이 크게 줄어듭니다.
이는 실제로 돈이 드는 것이 아니라, 시스템의 성능을 향상하는 방법입니다. 실제로 돈이 드는 것은 데이터베이스 서비스를 사용할 때 발생하는 비용이며, 이는 사용하는 데이터베이스 서비스의 요금제에 따라 다릅니다.
커넥션 풀과 데이터베이스의 요금 상관도는?
데이터베이스 서비스의 요금은 서비스 제공업체와 선택한 요금제에 따라 다양하게 측정됩니다.
일반적으로 다음과 같은 요소들을 고려하여 요금을 책정합니다:
스토리지 사용량: 데이터베이스에 저장된 데이터의 크기에 따라 요금이 부과됩니다. 데이터가 많아질수록 스토리지 비용도 증가합니다.
컴퓨팅 리소스: 데이터베이스 서버의 CPU, 메모리 등의 컴퓨팅 리소스 사용량에 따라 요금이 책정됩니다. 더 많은 리소스를 사용하면 비용이 더 많이 듭니다.
네트워크 트래픽: 데이터베이스 서버와의 데이터 전송량에 따라 요금이 부과될 수 있습니다. 이는 특히 클라우드 기반 데이터베이스 서비스에서 중요한 요소입니다.
백업 및 복구: 데이터베이스 백업과 복구 기능 사용에 따른 비용이 있을 수 있습니다.
고급 기능: 고가용성, 자동 확장, 고급 보안 등 고급 기능 사용에 따른 추가 비용이 있을 수 있습니다.
이러한 요소들은 모두 데이터베이스 서비스 제공업체와 선택한 요금제에 따라 다르며, 일부는 실제 사용량에 따라 비용이 변동하는 종량제 방식을 사용할 수 있습니다. 따라서 정확한 비용을 알려면 해당 데이터베이스 서비스의 요금제를 확인해야 합니다.
오버로딩
오버라이딩은 무엇인가?
'오버로딩(Overloading)'과 '오버라이딩(Overriding)'은 모두 자바의 다형성을 구현하는 방법 중 하나입니다.
**오버로딩(Overloading)**은 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다.
이때 메서드들은 매개변수의 타입이나 개수가 달라야 합니다.
오버로딩을 통해 같은 기능을 하는 메서드에 대해 같은 이름을 사용할 수 있어 코드의 가독성이 향상됩니다.
오버로딩(Overloading)
└─ 같은 이름의 메소드를 여러 개 정의
└─ 매개변수의 타입이나 개수가 다름
└─ 코드 가독성 향상
오버라이딩(Overriding)
└─ 상속 관계의 클래스에서 상위 클래스의 메소드를 하위 클래스에서 재정의
└─ 상위 클래스의 기능을 하위 클래스에서 변경하거나 확장
java
public class OverloadingExample {
void print(String s) {
System.out.println("Printing string: " + s);
}
void print(int i) {
System.out.println("Printing integer: " + i);
}
void print(double d) {
System.out.println("Printing double: " + d);
}
public static void main(String[] args) {
OverloadingExample example = new OverloadingExample();
example.print("Hello");
example.print(10);
example.print(3.14);
}
}
위 코드를 실행하면 아래와 같은 출력을 볼 수 있습니다:
Printing string: Hello
Printing integer: 10
Printing double: 3.14
다음으로 오버라이딩(Overriding)에 대한 예제를 들어 설명드리겠습니다.
아래의 코드에서 Dog 클래스는 Animal 클래스를 상속받았고, speak 메서드를 재정의(오버라이딩)하였습니다. Dog 클래스의 speak 메소드는 Animal 클래스의 speak 메소드와 같은 이름, 같은 매개변수를 가지고 있지만, 메소드의 내용이 변경되었습니다.
java
public class OverridingExample {
// 상위 클래스
public static class Animal {
void speak() {
System.out.println("The animal speaks");
}
}
// 하위 클래스
public static class Dog extends Animal {
@Override
void speak() {
System.out.println("The dog barks");
}
}
public static void main(String[] args) {
Animal animal = new Animal();
animal.speak();
Dog dog = new Dog();
dog.speak();
}
}
위 코드를 실행하면 아래와 같은 출력을 볼 수 있습니다:
The animal speaks
The dog barks
이처럼 오버로딩은 같은 이름의 메소드를 매개변수의 타입이나 개수를 다르게 하여 여러 개 정의하는 것이고, 오버라이딩은 하위 클래스에서 상위 클래스의 메소드를 재정의하는 것입니다. 이 두 기능은 모두 자바의 다형성을 구현하는 중요한 요소입니다.
스프링 부트와 스프링 MVC 중 선택 기준
스프링 부트와 스프링 MVC 중 선택 기준은 프로젝트의 성격, 개발 일정, 팀원들의 기술 숙련도 등 다양한 요소에 따라 달라집니다.
스프링 부트의 주요 장점은 설정의 간소화와 빠른 개발 속도입니다.
스프링 부트는 자동 설정, 내장 서버 지원, 독립적으로 실행 가능한 JAR 배포 등을 통해 개발자가 빠르게 애플리케이션을 개발하고 배포할 수 있게 돕습니다.
스프링 MVC는 스프링 부트보다 설정이 복잡하고, 배포도 약간 더 복잡할 수 있지만,
세밀한 설정과 튜닝이 가능하다는 장점이 있습니다.
이로 인해 성능 최적화, 특정 환경에 맞는 설정 등이 필요한 대규모 프로젝트에서는 스프링 MVC를 선택할 수 있습니다.
주어진 상황에서는 개발 일정이 빠듯하고, 새로운 기술을 도입하고 싶다는 점, 기존에 스프링 MVC의 설정에 고생했다는 점 등을 고려하면 스프링 부트를 선택하는 것이 좋아 보입니다. 스프링 부트는 빠른 개발과 간편한 설정을 지원하므로 주어진 요구 사항에 잘 맞습니다.
스프링 부트
장점
├─ 간편한 설정: 자동 설정과 스프링 부트 스타터를 통해 빠르게 개발 시작
├─ 빠른 개발: 내장 서버 지원, 독립적으로 실행 가능한 JAR 배포 등으로 개발 및 배포 속도 향상
└─ 커뮤니티 활성화: 많은 개발자들이 사용하고 있으며, 정보를 얻기 쉽고 문제 해결도 편리
단점
├─ 세밀한 설정 제한: 자동 설정으로 인해 세밀한 설정이 필요한 경우 제한적일 수 있음
└─ 학습 곡선: 스프링 부트가 제공하는 다양한 기능들을 이해하고 활용하기 위해선 시간이 필요
스프링 부트를 사용하면서 세밀한 설정이 필요한 경우, 해당 부분만 스프링 MVC 방식으로 설정을 할 수도 있습니다.
이런 유연성 덕분에 스프링 부트는 현업에서도 많이 사용되고 있습니다.
따라서, 스프링 부트를 선택하고 필요에 따라 세밀한 설정이 필요한 부분은 직접 커스텀하는 방향을 추천드립니다. 이렇게 하면 개발 속도는 유지하면서도 필요한 부분은 세밀하게 튜닝할 수 있습니다
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자 되는 법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프런트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할 말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
개발자상식 <백엔드 개발자> (12)[책리뷰 & Book review] (1) | 2024.01.23 |
---|---|
개발자상식 <백엔드 개발자> (11)[책리뷰 & Book review] (0) | 2024.01.23 |
개발자상식 <백엔드 개발자> (9)[책리뷰 & Book review] (0) | 2024.01.23 |
개발자상식 <백엔드 개발자> (8)[책리뷰 & Book review] (0) | 2024.01.15 |
댓글