- ๊ฐ๋ฐ์ ์งํํ ๋ GitHub๋ฅผ ํตํด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ์๋ค.
- ๋ด GitHub๊ณ์ ์ Jatdauree๋ผ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ง๋ค์์.
- ๊ฐ ํ์๋ค์ Collaborator๋ก ํด๋น ๋ ํฌ์งํ ๋ฆฌ์ ์ด๋ํ์๊ณ ๋ชจ๋ ์ปค๋ฐ/ ํธ์๋ ํญ์ ์์นจ์ ๋ชจ์ฌ์ ์คํ๋ผ์ธ์ผ๋ก ๋ด ๊ฐ๋ ํ์ ์ด๋ค์ง..
- ์ด๋ ๊ฒ ํ ์ด์ ๋ ๋๋จธ์ง ํ์๋ค์ด GitHub๋ฅผ ์ฌ์ฉํด๋ณธ์ ์ด ์๊ณ , ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํน์๋ผ๋ ๊ณต๋ค์ฌ์ ๋ง๋ค์ด๋์ ํ๋ก์ ํธ์ ๋ณํฉ ์ถฉ๋์ด๋ผ๋ ๋๋ฉด ๋งค์ฐ ๊ณค๋ํด์ง๋๊น..
- ๋ AWS ์๋น์ค์์ ์ ๊ณตํ๋ ์ค์ ๊ฐ๊ณผ Secret ๊ฐ ๋ค์ ํน์๋ผ๋ ์ค์๋ก ํ์๋ค์ด ์ฌ๋ฆด๊น๋ด ํญ์ ์ฃผ์ํ๋ฉด์ ์ปค๋ฐ์ ์งํํ์๋ค.
- ๋งค์ผ API๋ช ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ํ์๋ค์๊ฒ ์ญํ ๋ถ๋ด์ ํ์ง๋ง,, ์ค๋ฅ๋ Java๊ฐ๋ ๋ถ์กฑ ๋ฑ์ผ๋ก ๊ฐ๋ฐ์ด ๋๋์ ๊ตฌ์๋ง ๊ฐ์ถ๊ณ ๋ด๊ฐ ์ต์ข ๋ก์ง์ ์์ฑํ๋ ๊ฒ์ด ๋๋ถ๋ถ์ด์๋ค.
- ํ๋ ์์ํฌ : SpringBoot (Gradle)
- ์๋น์ค ์ ๊ณต๋ฐฉ๋ฒ : RestFul API
- ์๋ฐ SDK ๋ฒ์ : 11.0.15
- SpringBoot ๋ฒ์ : 2.7.13
- ์ฌ์ฉํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
(์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ก์ง ๊ตฌํ์์ ๋์ค์ ์ค๋ช ํ๊ฒ ์.)dependencies { implementation 'org.jetbrains:annotations:19.0.0' // (1) DB implementation group:'mysql', name:'mysql-connector-java', version:'8.0.32' implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-jdbc' // (2)authenticate implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' testImplementation 'org.springframework.security:spring-security-test' implementation "io.jsonwebtoken:jjwt:0.9.1" // (3)Lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' // (4)nurigo ๋ฌธ์์ธ์ฆ implementation 'net.nurigo:sdk:4.2.7' // (5)iamport ๊ฒฐ์ ์ฐ๋ allprojects { repositories { //... maven { url 'https://jitpack.io' } } } implementation 'com.github.iamport:iamport-rest-client-java:0.2.21' // Retrofit2 //implementation 'com.squareup.retrofit2:retrofit:2.7.2' //implementation 'com.squareup.retrofit2:converter-gson:2.7.2' //implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0' // (6)aws cloud s3 implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' implementation 'org.springframework.cloud:spring-cloud-aws-context:2.2.6.RELEASE' implementation 'org.springframework.cloud:spring-cloud-aws-autoconfigure:2.2.6.RELEASE' // (7)spring boot implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web-services' testImplementation 'org.springframework.boot:spring-boot-starter-test' }
- ๋ฐฐํฌ ์๋ฒ : AWS EC2 ์ธ์คํด์ค (ํ๋ฆฌํฐ์ด)
- IP ์ฃผ์ : AWS Elastic IP
- ๋๋ฉ์ธ ์ฃผ์ : ๊ฐ๋น์ ๋๋ฉ์ธ ์๋น์ค (www.insung.shop)
- ๋ฐฐํฌ ๋ฐฉ๋ฒ : GitHub SSH ํด๋ก ๋ฐ ํ (์ฃผ์ ์ํฌ๋ฆฟ ํ์ผ์ ์๋ ๋ฐฐํฌ)
- ์ธ์คํด์ค๋ ๋ฆฌ๋ ์ค Ubuntu ์ด์์ฒด์ ์ด๊ณ , GitHub์์ ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ์ฌ ๋ฐฐํฌํ์๋ค.
- WinSCP ํด์ ์ด์ฉํด์ ํด๋น ์ธ์คํด์ค์ Putty ํ๊ฒฝ์ผ๋ก SSH ์ ์์ ํตํด ์ธ์คํด์ค ๊ด๋ฆฌ๋ฅผ ํ์๋ค.
- ์๋ฒ ๊ตฌํ์ ์ํด nginx๋ฅผ ์ธ์คํด์ค์ ์ค์นํ์ฌ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ฐ๊ฒฐ์ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ํฌํธํฌ์๋ฉ์ ์งํํจ.
nginx.conf
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; // ์ด๋ฏธ์ง ์์ฒญ์ ์ํ ํด๋ผ์ด์ธํธ ๋ฐ๋ ์ฌ์ด์ฆ ์ค์ client_max_body_size 10M; } #mail { # # See sample authentication script at: # # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript # # # auth_http localhost/auth.php; # # pop3_capabilities "TOP" "USER"; # # imap_capabilities "IMAP4rev1" "UIDPLUS"; # # server { # listen localhost:110; # protocol pop3; # proxy on; # } # # server { # listen localhost:143; # protocol imap; # proxy on; # } #}
- nginx ์ค์ default ํ์ผ
server { // (1) ํ๋ก์ ํธ ๊ฒฝ๋ก root /var/www/jatdauree; // (2) ๊ธฐ๋ณธ ์ฐ๊ฒฐ ์์ index index.html index.htm index.nginx-debian.html; // (3) ๋๋ฉ์ธ ์ด๋ฆ server_name insung.shop www.insung.shop; // (4) ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์ location / { proxy_pass http://localhost:1920; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; # try_files $uri $uri/ =404; } // (5) HTTPS ๋ณด์ ์ค์ listen [::]:443 ssl ipv6only=on; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate ssl ์ธ์ฆ์ ๊ณต์ ํค ๊ฒฝ๋ก ssl_certificate_key ์ธ์ฆ์ ๊ฐ์ธํค ๊ฒฝ๋ก include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } // (6) ๋ฆฌ๋ค์ด๋ ์ ์ค์ server { if ($host = www.insung.shop) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = insung.shop) { return 301 https://$host$request_uri; } # managed by Certbot listen 80 default_server; listen [::]:80 default_server; server_name insung.shop www.insung.shop; return 404; # managed by Certbot }
- (1) ํ๋ก์ ํธ ๊ฒฝ๋ก
: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๋๊ณ ์คํ๋๋ ๊ฒฝ๋ก- (2) ๊ธฐ๋ณธ ์ฐ๊ฒฐ ์์
: ๋๋ฉ์ธ ์ฐ๊ฒฐ ์ ๋ณด์ฌ์ค ๊ธฐ๋ณธ ๋ทฐ- (3) ๋๋ฉ์ธ ์ด๋ฆ
: ๋๋ฉ์ธ ์ฃผ์ ์ค์ - (4) ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
: nginx์๋ฒ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ํฌํธ ํฌ์๋ฉํ๋ ์ค์ - (5) HTTPS ๋ณด์ ์ค์
: CertBot์ ์ด์ฉํ์ฌ SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ HTTPS ๋ณด์์ค์ - (6) ๋ฆฌ๋ค์ด๋ ์ ์ค์
: ์๋ฒ์ HTTPS ์ค์ ์ด ์๋ ์์ฒญ์ ๋ชจ๋ HTTPS๋ก ๋ฆฌ๋ค์ด๋ ์
AWS RDS๋ฅผ ํตํ์ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ์ด์ํ์๋ค.
(์ง๊ธ์ ์ค๋ ์ท ์ฒ๋ฆฌ..)
AWS S3 ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ๋ค์ด์ค๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ์๋ค.
jatdauree ใด src/main - ๋ฉ์ธ ํจํค์ง ใด java ใด com/example/jatdauree ใด config - ์ค์ ํ์ผ ๋ฐ ๋ฐํ ํ์ ํด๋์ค ใด secret - ์ํฌ๋ฆฟ ํค ๋ฐ ์ํธํ ํ์ผ (git ignore ์ฒ๋ฆฌ) ใด IamPortRestClient - PortOne ๊ฒฐ์ ๊ด๋ จ ํจํค์ง ใด src ใด domain - ๋๋ฉ์ธ ํจํค์ง ใด app - ๊ตฌ๋งค์ ๋๋ฉ์ธ ํจํค์ง ใด kakao - ์นด์นด์ค ์์น๊ธฐ๋ฐ ์๋น์ค ํด๋์ค ํจํค์ง ใด web - ํ๋งค์ ๋๋ฉ์ธ ํจํค์ง ใด utils - ์ํธํ ๋ฐ ์ด๋ฏธ์ง ํ์ผ ์ค์ ํด๋์ค ใด comein - ๋ณด์ ๊ด๋ จ IP ํด๋์ค ใด jwt - ์ธ๊ฐ ํ ํฐ ๊ด๋ จ ํจํค์ง ใด resources
- ๊ฐ ๋๋ฉ์ธ ๋ณ ํจํค์ง๋ฅผ ๋ฐ๋ก ๋ง๋ค๊ณ , ๋ด๋ถ์๋ dao, dto, service, controller ํด๋์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ํจํค์ง๋ก ๋๋ ์ ธ์๋ค.
- ์ด๋ ๊ฒ ํ ์ด์ ๋ GitHub๋ก ๊ฐ์ ๋งก์ ๋๋ฉ์ธ์ ๋ฐ๋ก ์ปค๋ฐํ์ฌ ์ถฉ๋์ ๋ฐ์์ํค์ง ์์ผ๋ ค๊ณ ํ๊ธฐ ์ํจ!
- ๋ฐ์ WebConfig, WebSecurityConfig ํด๋์ค๋ ๋ณด์ ์ค์ ์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. (๋์ค์ ํฌ์คํ )
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ฐ ๋น๋๋ฅผ ์ํ ํ๋ก์ ํธ ๋ด ์ค์ ํ์ผ์ด๋ค.
server.port = 1920 server.servlet.encoding.charset=UTF-8 server.servlet.encoding.enabled=true server.servlet.encoding.force=true # AWS RDS spring.datasource.url = spring.datasource.username= spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # AWS CLOUD & S3 cloud.aws.credentials.access-key= cloud.aws.credentials.secret-key= cloud.aws.region.static= cloud.aws.stack.auto= cloud.aws.s3.bucket= cloud.aws.s3.bucket.url= spring.servlet.multipart.maxFileSize=50MB spring.servlet.multipart.maxRequestSize=50MB whois.api.key= whois.api.uri= logging.level.com.amazonaws.util.EC2MetadataUtils=error