AIλ₯Ό ν΅ν΄ λλΆλ¬μ§κ² μμ곡μΈκ³Ό λμμ΄λλ₯Ό λ§€μΉνλ νλ«νΌ ArtConnectμ λλ€.
μ£Όμ μν€ν μ² μ€κ³μ API λͺ μΈμλ λ Έμ μ λ³λλ‘ μμ±νμμ΅λλ€.
λ Έμ μμ΄μ½μ λλ₯΄λ©΄ νμ΄μ§λ‘ μ°κ²°λ©λλ€.
μλμ λ΄μ©μ ν΄λΉνλ μμ κ°μ΄λλ λ¨μν λ‘컬 νκ²½μμ μλ²λ₯Ό μ€νν΄λ³΄κΈ° μν λ΄μ©μ λλ€. μΆκ°λ‘ λ°°ν¬κ° νμνλ€λ©΄ μλ λ§ν¬λ₯Ό μ°Έκ³ νμ¬ AWS EC2μ μλ²λ₯Ό μ€νν λ€μ, HTTPSλ‘ μ μ©νλ κ³Όμ μ΄ νμν©λλ€.
-
EC2 & RDSλ₯Ό ν΅ν κ°λ¨νκ² μλ² λ°°ν¬νκΈ°: https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/tutorial-connect-ec2-instance-to-rds-database.html
-
HTTP μλ²λ₯Ό HTTPSλ‘ λ³κ²½νκΈ°: https://hoonsb.tistory.com/83#2.%20%ED%95%B4%EA%B2%B0-1
- Java 21 μ΄μ
- Spring Boot 3.5.x μ΄μ
- MySQL 8.0 μ΄μ
- Docker Desktop 27.x μ΄μ
git clone https://github.com/ThonliveThondie/art-connect-backend
2. application-ai.yml, application-awss3.yml, application-db.yml, application-jwt.yml, application-oauth.yml, .env νμΌ λ³λ μμ± ν μΆκ°
μμ μΈκΈν νμΌμ 보μ μ κΉνλΈμ μ λ‘λνμ§ μμ ν¬ν¨λμ§ μμ νμΌλ€μ λλ€.
μλμ νμλ {} μμμ κ°μ μ€μ μ λ§κ² μμ±ν΄μ£ΌμΈμ.
Spring AIλ₯Ό ν΅ν΄ Anthropic AIλ₯Ό μ¬μ©νκΈ° μν΄μλ API ν€ λ±λ‘μ΄ νμν©λλ€. μλ λ§ν¬μμ API ν€ μμ± ν νμΌμ μμ±ν΄μ£ΌμΈμ.
- Anthropic Claude Console: https://console.anthropic.com/login
local-ai:
anthropic:
claude:
api-key: {ANTHROPIC_API_KEY}
chat:
options:
model: claude-3-5-sonnet-20241022
temperature: 0.7
max-tokens: 800
νμ¬ νλ‘μ νΈμμλ μ¬μ©μκ° μ΄λ―Έμ§λ₯Ό μ λ‘λνκ³ λ€μ΄λ°λ κΈ°λ₯μ μ 곡νκΈ° μν΄ AWS S3 λ²ν·μ μ¬μ©νκ³ μμ΅λλ€. μλ λ§ν¬λ₯Ό μ°Έκ³ ν΄μ λ²ν· μμ± ν μ€μ κ°μ μ λ ₯ν΄μ£ΌμΈμ.
- Spring Bootλ‘ S3 μ΄λ―Έμ§ μ λ‘λ κΈ°λ₯ ꡬννκΈ°: https://yel-m.tistory.com/19
# AWS S3
cloud:
aws:
credentials:
access-key: {ACCESS_KEY}
secret-key: {SECRET_KEY}
region:
static: {BUCKET_REGION} # λ²ν·μ 리μ
s3:
bucket: {BUCKET_NAME} # λ²ν· μ΄λ¦
stack:
auto: false
spring:
servlet:
multipart:
max-file-size: 50MB
max-request-size: 50MB
DBμΈ MySQL μ°κ²°μ νμν μ€μ κ°μ μ λ ₯ν©λλ€.
local-db:
mysql:
host: localhost
port: 3308
name: artconnect
username: {MySQL μ¬μ©μ μ΄λ¦}
password: {MySQL μ¬μ©μ λΉλ°λ²νΈ}
JWT μν¬λ¦Ώ ν€μ μμ ν μμ±μ μν΄ OpenSSL ν°λ―Έλ λͺ λ Ήμ΄λ‘ λμλ₯Ό μμ±ν©λλ€. OpenSSL μ€μΉλ μλ λ§ν¬λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
- OpenSSL μ€μΉ 곡μ μ¬μ΄νΈ: https://slproweb.com/products/Win32OpenSSL.html
λ€μ λͺ λ Ήμ ν΅ν΄ λμλ₯Ό μμ±ν λ€μ, Base64 νμμΌλ‘ μΈμ½λ©νμ¬ μΆλ ₯ν©λλ€.
openssl rand -base64 64
μΆλ ₯λ ν€λ₯Ό 볡μ¬νμ¬ μλμ application-jwt.yml νμΌμ μμ±ν΄μ€λλ€.
# JWT μ€μ
jwt:
secret-key: {JWT SECRET KEY}
# Access Token μ€μ (15λΆ)
access:
expiration: 900000
header: Authorization
# Refresh Token μ€μ (7μΌ)
refresh:
expiration: 604800000
header: Authorization-refresh
ν΄λΉ νμΌμ OAuth 2.0 μμ λ‘κ·ΈμΈ μ μ©μ μν΄ μμ±ν νμΌμ λλ€.
OAuth 2.0μ λν μμΈν λ΄μ©κ³Ό μ€μ λ²μ μλ λ§ν¬λ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ.
- Spring Security OAuth 2.0μ μ¬μ©νμ¬ μμ λ‘κ·ΈμΈ κ΅¬ν: https://ksh-coding.tistory.com/63
Google, Kakao, Naver κ°λ°μ μΌν°μμ API μ΄μ© λ±λ‘ ν application-oauth.ymlμ μμ±ν νμΌμ λ€μκ³Ό κ°μ΅λλ€.
spring:
security:
oauth2:
client:
registration:
google:
client-id: {ν΄λΌμ΄μΈνΈ μμ΄λ}
client-secret: {ν΄λΌμ΄μΈνΈ λΉλ°ν€}
scope: profile, email
redirect-uri: {λ±λ‘ν 리λ€μ΄λ μ
URI}
naver:
client-id: {ν΄λΌμ΄μΈνΈ μμ΄λ}
client-secret: {ν΄λΌμ΄μΈνΈ λΉλ°ν€}
redirect-uri: {λ±λ‘ν 리λ€μ΄λ μ
URI}
authorization-grant-type: authorization_code
scope: name, email, profile_image
client-name: Naver
kakao:
client-id: {ν΄λΌμ΄μΈνΈ μμ΄λ}
client-secret: {ν΄λΌμ΄μΈνΈ λΉλ°ν€}
redirect-uri: {λ±λ‘ν 리λ€μ΄λ μ
URI}
client-authentication-method: client_secret_post
authorization-grant-type: authorization_code
scope: profile_nickname, profile_image
client-name: Kakao
provider:
naver:
authorization-uri: https://nid.naver.com/oauth2.0/authorize
token-uri: https://nid.naver.com/oauth2.0/token
user-info-uri: https://openapi.naver.com/v1/nid/me
user-name-attribute: response
kakao:
authorization-uri: https://kauth.kakao.com/oauth/authorize
token-uri: https://kauth.kakao.com/oauth/token
user-info-uri: https://kapi.kakao.com/v2/user/me
user-name-attribute: id
MYSQL_DATABASE: artconnect
MYSQL_USERNAME: {MySQL μ¬μ©μ μ΄λ¦}
MYSQL_ROOT_PASSWORD: {MySQL μ¬μ©μ λΉλ°λ²νΈ}
μμμ μμ±ν 5κ° νμΌμ μλ μ¬μ§μ νλ‘μ νΈ λλ ν°λ¦¬ ꡬ쑰(src/main/resources/security/)μ μ νν μΌμΉνλλ‘ λ£μ΄μ£ΌμΈμ.
Intellij ν°λ―Έλ μ°½ λλ λ€λ₯Έ ν°λ―Έλ μ°½μ ν΅ν΄ docker-compose.yml νμΌ μμΉλ‘ μ΄λ ν docker compose νμ¬ MySQL λ°μ΄ν°λ² μ΄μ€ 컨ν
μ΄λλ₯Ό μλ‘κ² μΆκ°νμ¬ μ€νν©λλ€.
docker compose up -d