๐ src\main\java\com.name\nameApplication.java(Class)
package com.urface.cit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UrfaceApplication {
public static void main(String[] args) {
SpringApplication.run(UrfaceApplication.class, args);
}
}
๋ก์ปฌ ํธ์คํธ์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
swagger-ui 3.x version ์ด์ http://localhost:8080/swagger-ui/index.html
swagger-ui 3.x version ๋ฏธ๋ง http://localhost:8080/swagger-ui.html
๐ src\main\application.yml
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
application:
name: name
๐ build.gradle(name)
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.5'
id 'io.spring.dependency-management' version '1.1.4'
id 'com.netflix.dgs.codegen' version '6.0.3'
id 'org.graalvm.buildtools.native' version '0.9.28'
id 'dev.hilla' version '2.5.5'
id 'com.vaadin' version '24.3.10'
}
group = 'org.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('hillaVersion', "2.5.5")
set('springModulithVersion', "1.1.4")
set('vaadinVersion', "24.3.10")
springCloudVersion = "2023.0.1"
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
// implementation 'io.springfox:springfox-boot-starter:3.0.0'
// implementation 'io.springfox:springfox-swagger2:2.9.2'
// implementation 'io.springfox:springfox-swagger-ui:2.9.2'
}
dependencyManagement {
imports {
mavenBom "dev.hilla:hilla-bom:${hillaVersion}"
mavenBom "org.springframework.modulith:spring-modulith-bom:${springModulithVersion}"
mavenBom "com.vaadin:vaadin-bom:${vaadinVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:$springCloudVersion"
}
}
tasks.named('test') {
useJUnitPlatform()
}
generateJava {
schemaPaths = ["${projectDir}/src/main/resources/graphql-client"]
packageName = 'org.example.urface.codegen'
generateClient = true
}
build.gradle์์ ๊ต์ฅํ ๋ง์ ์๊ฐ์ ์๋ชจํ๋ค.
์ด์ ๋ Spring boot์ swagger ๋๋ฌธ์ด๋ค.
๋๋ ๊ตฌ๊ธ๋ง์ ํตํด์ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ณด์๋ค.
1. ๋ฒ์ ๋ง์ถ๊ธฐ
2. ๋ฒ์ ์ ๋ฐ๋ฅธ ์ฌ์ฉ๋ฒ ๋ณ๊ฒฝ...๋ฑ๋ฑ
ํ์ง๋ง 404ERROR ๊ทธ๋ฆฌ๊ณ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ ERROR 2๊ฐ์ง๋ฅผ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๊ฒช์๋ค.

๊ฒฐ๋ก ์ SwaggerConfig.java๋ฅผ ์์ฑํ์ง ์๋๊ฒ์ผ๋ก ์งํํ๋ค.
springdoc์ ๊ฒฝ์ฐ SwaggerConfig๊ฐ ์์ด๋ Ui๋ฅผ ๋ง๋ค ์ ์๋ ๊ธฐ๋ฅ์ด ์์ด ์ด๋ฅผ ์ด์ฉํ๋ ๊ฒ์ผ๋ก ๋ง๋ฌด๋ฆฌํ๋ค. ์ด์ ๋ ์ด ์ค์ต์ ๋ฐฑ์๋ ๊ตฌ์ฑ ๋ณด๋ค๋ AWS ์ค์ต์ด ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
16์๊ฐ์ ๊ฐ์๋ฒ๋ฆฐ๊ฒ์ ๋น๋ฐ์ด๋ค..
๐ src\mian\java\com.name\controller\MemberService.java
package com.urface.cit.controller;
//import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberService {
@GetMapping("/members")
// @ApiOperation("ํ์์กฐํ")
public void get(){
}
@PostMapping("/members")
// @ApiOperation("ํ์๋ฑ๋ก")
public void register(){
}
@DeleteMapping("/members")
// @ApiOperation("ํ์์ญ์ ")
public void delete(){
}
}
์ด์ ๋ชจ๋ ์์ ์ด ๋๋ซ๊ธฐ ๋๋ฌธ์ AWS ์ค์ต์ผ๋ก ๋์ด๊ฐ์
์ด์ VPC๋ฅผ ์์ฑํด์ฃผ์.
๊ณผ์ ์ ์๋์ ๊ฐ์ด ์งํํ๋ฉด ๋๋ค.




์์ฑ์ด ์๋ฃ๋๋ฉด ์๋์ฒ๋ผ ๋์ฌ๊ฒ์ด๋ค.
ํ...์ด๋ฆ์ vpc๊ฐ ๋ฌ๋ ค์ ๋์ค๋๊น ๋ค์๋ถํฐ๋ ๊ทธ๋ฅ name๋ง ์์ฑํด์ผ๊ฒ ๋ค..
์ด๋ฆ์ ์๋์ฒ๋ผ ๋ฐ๊พธ์ด์ฃผ์.
์ธ๋ถ์ ๋ณด
์๋ธ๋ท
๋ผ์ฐํ
ํ
์ด๋ธ
์ธํฐ๋ท ๊ฒ์ดํธ์จ์ด
NAT ๊ฒ์ดํธ์จ์ด
์ธ๋ถ๋ก ๋๊ฐ๋ IP๋ ๋ณด์ด๋ ๊ฒ์ฒ๋ผ 52.79.73.57๋ก ๋๊ฐ๋ ๊ฒ์ด๋ค.






์ด ์ค์ต์์๋ Private๋ง ์ฌ์ฉํ ๊ฒ์ด๋ค. -> Public์ด ๋ ์ฌ์

Elasticbeanstalk์ ๋ง๋ค๋ฉด ์๋์ผ๋ก EC2๋ ๋ง๋ค์ด์ง๋ค.
์ด์ ์ด ์๋ฒ๋ก ์ ์ํ ์์๋ Baston host ์ญํ ์ ํ ์ ์๋ EC2๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ์.



ํฐ์ดํ ์ ํ๋๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ micro๋ก ๋ง๋ค์ด์ฃผ๋ฉฐ Key๋ ์ด์ ์ ๋ง๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
๋๋ putty๋ฅผ ์ฌ์ฉํด๋ณด์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ฌ์ฉํ ๊ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉฐ
์๋ค๋ฉด ์๋ก ์์ฑํ๋ฉด ๊ทธ๋ง์ด๋ค.
์ด๋ ๊ฒ ์งํํ๋ค ๋ณด๋ฉด Elasticbeanstalk์ ์์ฑํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ด๋ ์ฐธ๊ณ ๋ฅผ ํ์ธํ๊ณ ํด๊ฒฐํ์. ๋ฌผ๋ก ๋ค์ ๋ง๋ค์ด์ผ ํ๋ค.

์ฑ๊ณต์ด๋ค!!
์ด์ Putty๋ฅผ ์คํํด์ BastonHost์ ์ ์ํด๋ณด์. ์๋ ํผ๋ธ๋ฆญ IPv4 DNS์ ์ฃผ์๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋์ด๋ค! (Login as ๋ผ๊ณ ๋จ๋ฉด ๊ทธ๋ฅ ec2-user๋ฅผ ์์ฑํด๋ผ ๊ทธ๋ผ ์ ์๋จ ใ
ใ
)


๋ฌผ๋ก ๋ด๊ฐ ๊ฐ์ง Key์ ์์น๋ฅผ Connection\SSH\Auth\Credentials์์ ์์ฑํด์ฃผ๋ ๊ณผ์ ์ด ์๋ค.
๋ํ Elasticbeanstalk์ผ๋ก ๋ง๋ EC2์ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ ์ํ๋ ค ํ๋ฉด ์ ์์ ํ ์ ์๋ค.
์ด๋๋ bastonHost๋ฅผ ํตํด์ ์ ์์ ํ๋ ๊ฒ์ด๋ค.
๋จผ์ Window์๋ vi๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์
๋๋ Gitbash๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
Gitbash๋ Vi๋ฅผ ์ง์ํ๋ค ๊ฐ๊ฟ ใ
ใ
Vim ๊น์์ ์จ๋ณด๊ฒ๋ค๊ณ ๊น๋ถ๋ค๊ฐ 1์๊ฐ ๋ ๋ฆฐ๊ฑด ๋น๋ฐ..
์์๋ฅผ ๋ค์ ์๊ธฐ ์์ผ๋ณด์.
1. Putty์์ bastonhost์ ์ ์
2. ๋ด๊ฐ ๊ฐ์ง๊ณ ์๋ pemํค ๋ด์ฉ์ gitbash์์ vi๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌ(๋๋ ๊ตฌ์ญ์ ๋๋์ด์ ๋ณต์ฌํจ.. y๋ก ๋ณต์ฌํ๋ผ๋๋ฐ ์๋๋๋ฐ..?)
3. pwd๋ฅผ ์์ฑํ์๋ ๋์จ ์ฃผ์๋ก cd ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ์
4. mkdir .ssh ์์ฑํด์ .ssh ๋ง๋ค๊ธฐ
5. ls -arlt ์์ฑํด์ .ssh ๋ง๋ ๊ฑฐ ํ์ธ
6. cd .ssh ์ ์
7. vi key_name.pem ์์ฑํด์ vi ํ๊ฒฝ์ผ๋ก ์ ์
8. Gitbash์์ ๋ณต์ฌํ ๋ด์ฉ ๋ถ์ฌ๋ฃ๊ธฐ(i๋ฅผ ๋๋ฌ์ insert ๋ชจ๋๋ก ์ง์
ํด์ผํจ)
9. ESC, shift+:, wq ์
๋ ฅํด์ ๋์ค๊ธฐ(์ ์ฅ์)
10. chmod 400 key_name.pem ์์ฑ
11. ssh -i key_name.pem ec2-user@ํ๋ฆฌ์๋น IPv4 ์ฃผ์
์ด๋ ๊ฒ ์ง์ ํ๋ฉด ์์ฑ์ด๋ค~!
์ด์ํ๋ก netstat -an | grep 5000 ์ ์์ฑํ๋ฉด ์ ์์ ์ผ๋ก ๋์๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ฐ.
Elasticbeanstalk๋ ๊ธฐ๋ณธ์ ์ผ๋ก 5000๋ฒ ํฌํธ์ด๋ค..
์ด์ DB๋ฅผ ๊ตฌ์ฑํด๋ณด์ ๋จผ์ ์๋ธ๋ท ๊ทธ๋ฃน์ ๋ง๋ค์ด์ฃผ์.


์ด์ DB๋ฅผ ์์ฑํ์



admin0411



launch-wizard-1์ ์ธ๋ฐ์ด๋ ๊ท์น์์ MySQL/Aurora, TCP, 3306, ๋ชจ๋ ๋ก ์ค์ ํด์ฃผ์ด์ผํ๋ค.
์ด๋ EC2์ ๋ณด์๊ทธ๋ฃน์์ ๊ฐ๋ฅํ๋ค.
์ด์ ์ด๋ ๊ฒ ๋ง๋ DB๋ฅผ ์ธํ
๋ฆฌ์ ์ด์์ ์ค์ ํ์.
์ธํ
๋ฆฌ์ ์ด๋ DB๋ฅผ ์ค๋ฅธ์ชฝ ํญ์์ ๊ด๋ฆฌํ๋ค.

์ด ์๋ํฌ์ธํธ ๋ฐ ํฌํธ๋ฅผ Host์ ๋ฃ์ด์ฃผ์
๊ทธ๋ผ ์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค!
ํํ ์ด๊ฑด Private์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ธํ
๋ฆฌ์ ์ด๊ฐ ์ฐธ ํธํ๋ค ๋ญ ํด์ผํ๋์ง ๋ณด์ฌ์ค๋ค...
ํด๊ฒฐ ๋ฐฉ๋ฒ์ SSH/SSLํญ์์ Use SSh tunnel์ ํด๋ฆญํด์ ์ค์ ์ ํด์ฃผ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ bastonhost๋ฅผ ํตํด์ ๋ง๋ค์ด ์ฃผ๊ฒ๋ค.



๊น๋ํ๊ฒ ์ฑ๊ณตํ๋ค.
์ด์ ๋ ์คํค๋ง๋ฅผ ๋ง๋ค์ด์ฃผ์.


ํ
์ด๋ธ๋ ๊ฐ๋จํ๊ฒ ํ๋๋ง ๋ง๋ค์ด์ฃผ์


์ ๋ง๋ค์ด ์ก๋ค~
S3 ๋ฒํท์ ๋ง๋ค์ด๋ณด์.

๋ฒํท ์ด๋ฆ๋ง ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์ ๋ง๋ค์ด์ ๊ธฐ์ตํ๊ณ ๋๋จธ์ง๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์ฑํ๋ค.
์ด์ ์์ฑ์ ๋ค์ด๊ฐ์ ์ ์ ์น ์ฌ์ดํธ ํธ์คํ
์ ํ์ฑํ ์์ผ์ฃผ์.

๋ญ๊ฐ๋ฅผ ํ์ธํ๋ ค๋ฉด Front๊ฐ ํ์ํ๋ค.
๊ฐ๋จํ๊ฒ React ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ฃผ์.
pip install npx
npx create-react-app urface-app
์นํ์ด์ง ๋์ฐ๊ธฐ
npm start
build ํ์ผ ์์ฑ
npm run build
npm install -g serve

build๋ฅผ S3์ ์ฌ๋ฆฌ๋ ๊ฒ์ด ๋ชฉํ์ด๋ค.
build ๋ด์ ํ์ผ๋ค์ S3์ ๋ง๋ urface.com์ ์
๋ก๋ ํด๋ณด์.
์ด์ ํผ๋ธ๋ฆญ ์ก์ธ์ค ์ฐจ๋จ(๋ฒํท ์ค์ )์ ํธ์งํด์ฃผ์ด์ผ ํ๋ค.


์ด์ ๋ฒํท ์ ์ฑ
์ ํธ์งํด์ฃผ์. ์ ์ฑ
์์ฑ๊ธฐ๋ฅผ ๋๋ฌ ์๋์ ๊ฐ์ด ๋ง์ถฐ์ฃผ๋ฉด ๋๋ค.




์ด์ ์์ฑ - ์ ์ ์น ์ฌ์ดํธ ํธ์คํ
์ผ๋ก ๊ฐ๋ฉด ์๋ํฌ์ธํธ๊ฐ ์๋ค.
์ง์
ํ๋ฉด ์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋จผ์ CodePipeline์ ๊ตฌ์ฑํด์ฃผ์.


์ฌ๊ธฐ์ master ์ด์ธ์ ๋ฐ๋ชจ๋ฒ์ ์ด ์๋ค๋ฉด ํ์ดํ๋ผ์ธ์ ๊ฐ๊ฐ ์์ฑํด์ฃผ์ด์ผ ํ๋ค.