프로젝트 개요 : 이것이 취업을 위한 백엔드 개발이다 클론코딩 - 상품관리 애플리케이션
프로젝트 환경 : IntelliJ, SpringBoot, MySQL
프로젝트 코드 : https://github.com/smkim9202/ProductManagement
데이터베이스 연동
DB 생성 SQL
- 상품
- 상품 번호 : 1부터 시작, 추가시 1씩 증가, 동일한 상품 번호 존재 불가
- 상품 이름 : 1~100글자 사이의 문자열, 동일한 이름 상품 존재 불가
- 가격 : 0~1,000,000원 사이의 값상품
- 재고수량 : 0~9,999개 사이의 값
// 스키마 목록 보기
SHOW DATABASES;
// 상품관리 스키마 생성
CREATE SCHEMA product_management;
// 사용할 스키마 지정
USE product_management;
// 상품 테이블 생성
CREATE TABLE products(
id BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price INT NOT NULL,
amount INT NOT NULL
);
// 테이블 목록 조회
SHOW TABLES;
// 상품 추가
INSERT INTO products(name, price, amount) VALUES('product 1', 100, 10);
INSERT INTO products(name, price, amount) VALUES('product 2', 200, 100);
INSERT INTO products(name, price, amount) VALUES('product 3', 300, 200);
// 상품테이블 조회
SELECT * FROM products;
BIGINT : JAVA에서 Long과 같은 범위의 자료형
VARCHAR : 문자열 타입, 괄호안에는 적힌 숫자의 글자까지 저장가능
PRIMARY KEY : id 컬럼의 값이 중복되지 않게하는 제약조건, 인덱스라는 것을 생성
인덱스 : id 컬럼을 기준으로 조회할 때 빠르게 조회되도록 도와주는 기능
NOT NULL : NULL 값이 들어오지 못하도록하는 제약조건
AUTO_INCREMENT : 해당 컬럼의 값이 하나씩 추가될 때마다 1씩 증가함을 나타냄
DB 접속
의존성 추가 : pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
spring-boot-starter-jdbc
스프링 부트에서 제공해주는 JDBC 관련 의존성 모음
JDBC(Java Database Connectivity)는 JAVA에서 데이터베이스에 접속하는 기능을 제공
mysql-connector-java
여러 데이터베이스 종류 중 MySQL에 접속하기 위해 필요한 의존성
데이터베이스 별로 개발하는 곳에서 언어별로 데이터베이스에 접속할 수 있는 라이브러리를 별도로 배포
접속 정보 추가 : application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/스키마이름
spring.datasource.username=계정아이디
spring.datasource.password=비밀번호
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
접속 테스트 : Application.java
@Bean
public ApplicationRunner runner(DataSource dataSource){
return args -> {
// 이 부분에 실행할 코드를 넣으면 된다.
Connection connection = dataSource.getConnection();
};
}
ApplicationRunner
스프링부트 애플리케이션 시작 직후 실행하려는 코드를 추가할수 있는 의존성
빈으로 동록하면서 람다 표현식 함수 내에 실행할 코드를 넣으면 됨
매개변수로 받고 있는 DataSource는 데이터베이스와의 연결을 담당하는 인터페이스로 데이터베이스와의 커넥션을 가져올 수 있음
상품관리 애플리케이션 실행
// 연결 성공 로그
... com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
... com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6d293993
... com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
// 연결 실패 로그 : SQL 연결정보가 틀린 경우
Caused by: java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
데이터베이스 커넥션과 커넥션 풀
- 애플리케이션에서는 데이터베이스와 연결을 수행하는 커넥션 인스턴스를 생성하고, 데이터베이스는 그에 상응하는 인스턴스를 만들어서 대응함
- 커넥션
- 애플리케이션과 데이터베이스 사이의 연결
- 웹 애플리케이션은 커넥션을 통해 SQL을 보내고, 데이터베이스는 받은 SQL 쿼리를 실행하고, 그 결과를 다시 커넥션으로 응답
- 커넥션 풀
- 애플리케이션이 앞으로 사용할 커넥션들을 미리 만들어 두고, 커넥션이 필요한 곳에 커넥션을 빌려줬다가 돌려 받음
- 사용하지 않는다면 데이터베이스와 커넥션을 맺을 때 해당 커넥션 인스턴스를 별도로 생성해 줘야 해서 리소스 낭비 발생
- 일반적으로 데이터베이스와의 커넥션은 미리 일정 수량을 만들어 두고, 해당 커넥션을 재사용
- spring-boot-starter-jdbc 의존성을 사용할 때 기본 설정으로 자동 생성 : 단 첫 번째 요청이 오기 전까지 커넥션 풀을 만들지 않음 => AppicationRunner 빈을 생성해 줌으로 커넥션 풀을 생성
- Hikaripool-1 Start completed : 성공적으로 커넥션 풀이 생성되었다는 로그 메시지
- HikariPool : 현재 스프링부트에서 기본으로 사용하는 커넥션 풀
- AppicationRunner를 통해 커넥션 풀을 초기화하는 이유
- 커넥션 풀이 처음 사용되는 시점에 생성되기 때문
- 초기화해 주지 않으면, 애플리케이션 시작 후 처음 받는 요청은 커넥션 풀이 생성되는 시간만큼 지연되어 응답이 느려짐
- 애플리케이션 시작과 함께 커넥션 풀을 초기화해 주는 것이 좋음
'프로젝트 > clone coding' 카테고리의 다른 글
[백엔드 개발 : ProductManagement] 클래스 추상화 (0) | 2025.04.10 |
---|---|
[백엔드 개발 : ProductManagement] 상품 관리 애플리케이션 기능 구현(MySQL) (0) | 2025.04.05 |
[백엔드 개발 : ProductManagement] 전역 예외 핸들러 추가 (0) | 2025.03.27 |
[백엔드 개발 : ProductManagement] 유효성 검사 추가 (0) | 2025.03.20 |
[백엔드 개발 : ProductManagement] 상품 조회/수정/삭제 구현 (0) | 2025.03.19 |