실제 서비스를 운영하려면
고객데이터 상품데이터 주문데이터 이런걸 다 저장해둬야하지 않겠습니까
엑셀이나 메모장에 저장해둬도 되긴 하는데 보통은 데이터베이스를 사용합니다.
그래야 대량의 데이터를 보관해둘 수도 있고 빠르게 원하는 데이터만 입출력할 수 있으니까요.
관계형 데이터베이스
데이터베이스는 여러 종류가 있습니다.
key : value 형태로 단순하게 저장하는 것도 있고
key : value를 여러개 묶어서 document 형태로 저장하는 데이터베이스도 있고
그래프나 벡터형식을 저장할 수 있는 데이터베이스도 있습니다.
근데 우리는 관계형 데이터베이스를 써볼겁니다.
역사와 전통이 있고 일반적으로 많이 쓰니까요.
(1) 관계형 데이터베이스는 표 형식으로 데이터를 저장해둡니다.
맨 윗줄에 어떤 데이터를 저장할지 미리 기록한 다음에 하나의 행마다 데이터를 기록합니다.
엑셀이랑 똑같음
(2) 데이터 입출력할 때 보통 SQL 이라는 언어를 써야 입출력이 가능합니다.
하지만 우리는 ORM이라고 부르는 라이브러리를 쓸건데 그거 쓰면 자바 문법으로 데이터 입출력이 가능해서 SQL부터 익힐 필요는 없습니다.
(3) 여러 DBMS 중에 하나 골라서 설치하면 데이터베이스 이용이 가능합니다.
한국에선 MySQL, Oracle, PostgreSQL 이런걸 자주 사용합니다.
서로 저장할 수 있는 데이터의 형식, 약간의 SQL 문법이 다를 수 있는데
근데 크게 다르진 않기 때문에 아무거나 써도 별로 상관없습니다.
우린 MySQL을 써보도록 합시다.
데이터베이스 호스팅받기
여러분 하드디스크에 직접 MySQL 설치해서 쓰거나
AWS 같은 클라우드 서비스가서 MySQL 호스팅을 받거나
둘 중 하나 고르면 됩니다.
근데 실제 서비스 운영할거면 당연히 클라우드 서비스에서 호스팅 받는게 안정적이고 좋을 것이니 그러도록 합시다.
AWS / Google Cloud / 마이크로소프트 Azure 이런것들이 있습니다.
대부분 카드등록하면 1년 무료 사용권을 주는데
AWS는 편하게 AWS RDS에서 데이터베이스호스팅 받으려면 요즘 IPv4 이용 명목으로 월 3달러 추가요금이 발생해서
우리는 Azure 써볼것이니 여기 들어가서 가입 후 카드등록까지 해옵시다.
(참고) Azure는 30일 경과 후엔 직접 종량제 요금제로 업그레이드버튼 눌러야 남은 11개월동안 무료로 이용이 가능합니다.
Supabase
Supabase 들어가면 카드등록 없이 PostgreSQL 무료 호스팅을 받을 수 있습니다.
500MB까지 저장이 가능한데 DB입출력이 7일동안 없으면 일시정지되는게 귀찮습니다.
어짜피 ORM 라이브러리 쓸 것이라 PostgreSQL, MySQL 아무거나 써도 문법이 달라지지 않아서 상관 없습니다.
DB만들고나서 설정 들어가서
DB접속용URL, DB접속용아이디, DB접속용비번만 잘 가져와두면 됩니다.
1. Azure 검색해서 들어가서 가입하고 카드등록까지 마칩니다.
portal.azure.com인데 마이크로소프트 계정으로 로그인해야합니다.
2. portal.azure.com 상단 검색창에서 'MySQL 유동서버' 검색 후 진입
그럼 만들기 버튼이 어딘가 있을텐데 눌러서 만들어봅시다.
3. 알아서 잘 채워줍니다.
- 구독/리소스 그룹은 비용관리용 폴더같은 것인데 대충 새로 만들어줍시다.
- 서버이름은 유니크하게 잘 작명하고 한국에서 서비스할거면 Korea 선택합시다.
4. 컴퓨팅/스토리지 선택하는 곳이 있을텐데
- Compute는 무료라고 써있는거 잘 선택하시고
- IOPS는 '미리 프로비전된 IOPS' + 최소사양을 선택해야 아마 추가요금이 없습니다.
360 저건 입출력을 1초에 360회로 제한한다는 뜻이라 나중에 유저 많아지면 '자동확장 IOPS' 이런거 쓰거나 조절해봅시다.
5. DB 접속용 아이디/비번도 만들어줍시다.
털리면 코딩인생 끝나는 것임
6. 다음 탭 눌러보면 접속가능한 IP주소도 설정할 수 있습니다.
- 안전하게 하려면 Azure 서버컴퓨터만 접속가능하게 '프라이빗 액세스' 이런걸 고르면 되겠지만
우리는 내 컴퓨터에서 접속해야하니까 '공용 액세스'를 고릅시다.
- 근데 다행히 특정 IP주소만 접속가능하게 보안장치를 하나 만들 수 있는데 여러분 IP주소 기입하면 됩니다.
어짜피 연습용이라 스타벅스에서 코딩할거면 모든 IP주소를 위 사진처럼 추가합니다.
그럼 나머지는 건드릴거 없을거고 데이터베이스 생성하면 됩니다. 대충 5~10분 걸림
7. 생성되었으면 마지막으로 설정할게 하나 있음
데이터베이스 생성되었으면 들어가보면 '서버 매개 변수' 설정할 수 있는 부분이 어딘가 있을텐데
들어가서 require_secure_transport를 OFF로 설정합시다.
어짜피 연습용인데 SSL 인증같은걸 잠깐 끄는 식입니다.
Database 생성 끝
AWS는요
AWS를 좋아한다면 AWS RDS 이런거 써도 되는데
올해부터 RDS 사용시 퍼블릭 액세스를 "예"로 설정하면 IPv4 사용요금 명목으로 월 3달러 정도 청구되는 것으로 바뀌어서
요금을 피하고 싶다면 AWS EC2 들어가서 인스턴스 하나 만들어서 같은 VPC그룹에 집어넣고 SSH 키파일도 가져온 다음에
SSH 터널링으로 내 컴퓨터 -> EC2 -> RDS DB 이런 식으로 접속하거나
아니면 RDS말고 EC2에 직접 설치해서 쓰면
1년무료 free tier 사용중일 경우 IPv4 요금이 아마도 청구되지 않을 것이기 때문에
EC2에서 컴퓨터 하나 빌려서 직접 MySQL 설치해서 써야합니다.
하지만 EC2에 설치하면 백업이나 모니터링 같은 것도 직접 해야하기 때문에 귀찮습니다.
DB 접속은
DB 접속해서 데이터를 미리보고 싶으면
DBeaver같은 프로그램 설치하는게 가장 쉽고 빠르고 좋습니다.
DBeaver 검색해서 설치하면 아마 상단에 데이터베이스 연결 버튼이 어딘가에 있을텐데 눌러봅시다.
Host 란에는 호스팅받은 데이터베이스 주소나 URL같은걸 Azure에서 가져와서 집어넣고
Username, Password 란에는 DB 접속용 아이디/비번 만든거 집어넣읍시다.
그리고 연결눌러보면 여러분 데이터베이스에 접속해서 데이터를 구경할 수 있습니다.
일단 데이터베이스부터 만들어봅시다.
실은 저번 시간엔 MySQL이라는 DBMS 호스팅을 받은 것이고
그 안에서 데이터를 실제로 저장하려면 '데이터베이스' 하나 만들어서 거기 저장해야합니다.
▲ 정확히 말하면 테이블이라는게 엑셀같은 표인데 거기 데이터를 저장합니다.
근데 그걸 모아놓은 폴더같은게 '데이터베이스'임
데이터베이스 생성은
DBeaver는 상단에서 SQL편집기 어쩌구를 열 수 있는데 거기서 SQL 코드를 짜서 실행할 수 있습니다.
CREATE DATABASE 데이터베이스명;
거기서 이런 코드 적고 실행하면 됩니다.
▲ 왼쪽 파일트리같은 곳에서 우클릭해서 간편하게 만들 수도 있습니다.
저는 shop 이름의 데이터베이스를 만들어봤습니다.
여기다가 테이블만들고 데이터도 넣고 그래볼 것임
하지만 DBeaver 같은 곳에서 데이터 쪼물거릴 일은 거의 없고
보통은 서버에서 코드로 데이터 입출력 하는게 일반적입니다.
그래서 서버 코드에서 이 데이터베이스에 접속 하려면 라이브러리 설치가 좀 필요합니다.
JPA와 MySQL 접속용 라이브러리 설치
dependencies {
runtimeOnly 'com.mysql:mysql-connector-j'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
build.gradle 파일에 추가하고 load gradle changes 버튼 누르면
JPA와 MySQL 접속도와주는 라이브러리가 설치 완료 됩니다.
spring.datasource.url=jdbc:mysql://호스팅받은곳엔드포인트주소/만든database이름
spring.datasource.username=DB접속아이디
spring.datasource.password=DB접속비번
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
application.properties 파일에 추가해두면 서버에서 MySQL 데이터베이스에 접속이 가능합니다.
이제 서버띄울 때 Hikari pool 어쩌구 안내메세지가 뜨면 DB접속 잘 되었다는 뜻입니다.
- 위의 4줄은 접속할 DB정보 입력하는 곳이고
- show_sql=true는 DB입출력시 SQL을 따로 실행창에 출력할지 여부
- ddl-auto=update는 코드짜서 테이블 생성이나 수정시 그걸 자동으로 DB에도 반영할지입니다.
update 해놓으면 변경사항반 반영되고 none 해놓으면 반영금지입니다.
none이 실제 서비스 운영할 땐 안정적인데 update도 나쁘지는 않습니다.
JPA가 뭐냐면
원래 관계형 데이터베이스는 SQL이라는 언어를 써서 데이터 입출력을해야하는데
그걸 좀 귀찮아하고 어려워하는 분들이 많습니다.
그래서 ORM이라는 라이브러리도 함께 설치해서 쓰는 경우가 많습니다.
ORM을 설치하면 SQL이 아니라 자바코드로 입출력을 해결할 수 있습니다.
테이블들을 클래스로 관리해서 타입체크도 되고 코드 재사용도 쉽고 여러 장점이 많습니다.
이거 쓰다가 마음에 안들면 직접 SQL 작성도 가능합니다.
실은 지금 설치하는 라이브러리를 Hibernate라고도 부르는데
JPA는 뭐냐면 자바에서의 ORM 표준 문법같은거고
JPA 문법을 개발자들이 쓰기쉽게 만들어준게 Hibernate라는 라이브러리입니다.
이게 제일 인기있어서 이거 JPA 어쩌구 설치하면 자동으로 Hibernate가 함께 설치되는 것임
그래서 JPA랑 Hibernate를 대충 혼용해서 많이 부릅니다.
runtimeOnly라고 적으면
코드를 컴파일할 때는 필요없는 라이브러리니까 컴파일 할 땐 쓰지말라는 소리입니다.
이 라이브러리 만든 사람이 runtimeOnly라고 사용해도 상관없게 만들어놔서 그럴 뿐입니다.
컴파일이뭐냐면 자바코드는 원래 실행하기 전에 컴퓨터 친화적인 바이트 코드로 변환해야하는데 그걸 컴파일이라고 부릅니다.
그래서 이렇게 쓰면 컴파일 되는 시간을 절약할 수 있겠군요.
그러기 싫으면 그냥 implementation 써도 상관없습니다.
그래서 코드를 실제로 실행할 때만 필요한 라이브러리들은 runtimeOnly만 적어놔도 되는데
DB입출력 도와주는 라이브러리나 로그 출력용 라이브러리들이 이런걸 써도 됩니다.
나머지는 쓸 일이 없음
아니면 반대로 compileOnly 라고 적으면 얘는 컴파일할 때만 쓰라는 뜻입니다.
그러면 개발할 때만 잠깐 쓰고 실제 서버구동시 필요없는 라이브러리들은 compileOnly 집어넣으면 나중에 용량을 절약할 수 있습니다.
나중에 써볼 것인데 코드 자동완성을 시켜주는 Lombok 라이브러리는 그런 식으로 설치해서 쓰기도 합니다.
Supabase 등에서 PostgreSQL 호스팅받아서 사용할 경우
dependencies {
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}
build.gradle 파일에 추가하고 load gradle changes 버튼 누르면
JPA와 PostgreSQL 접속도와주는 라이브러리가 설치 완료 됩니다.
spring.datasource.url=Supabase에 있던 Connection string
spring.datasource.username=Supabase에 있던 User
spring.datasource.password=Supabase에 있던 Password
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=update
Supabase 설정 들어가보면 JDBC버전의 Connection string, User, Password 정보를 가져올 수 있습니다.
그거 가져다가 application.properties 파일에 입력합시다.
Connection string 복붙할 때 패스워드 넣는 부분이 있으면 넣어줍시다.
서버가 잘 안뜨면 이런걸 확인해봅시다.
- DB접속 주소 잘 붙여넣었는지
- DB접속용 아이디 비번 안틀렸는지
- 아니면 MySQL의 경우엔 application.properties 파일에 주소 기재할 때 엔드포인트주소:3306/데이터베이스이름 이렇게 붙여야 잘될 수 있음
- application.properties 문자들 마지막에 이상한 공백같은거 있으면 안됨
'Spring Boot' 카테고리의 다른 글
웹서버와 웹페이지 만들기 (Controller), 상품목록 페이지 만들기 (Thymeleaf) (2) | 2025.03.19 |
---|---|
자바 기본 문법 (변수, 함수, if, for, class, constructor) (1) | 2025.03.18 |
Spring Boot란 (2) | 2025.03.16 |