1. Jar 서버 빌드 git Bash
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)
$ git clone https://github.com/samsung-lec/spring-blog-crud-basic.git
Cloning into 'spring-blog-crud-basic'...
remote: Enumerating objects: 871, done.
remote: Counting objects: 100% (871/871), done.
remote: Compressing objects: 100% (313/313), done.
remote: Total 871 (delta 363), reused 871 (delta 363), pack-reused 0 (from 0)
Receiving objects: 100% (871/871), 362.83 KiB | 36.28 MiB/s, done.
Resolving deltas: 100% (363/363), done.
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)
$ cd spring-blog-crud-basic/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ ls
README.md gradle/ gradlew.bat src/
build.gradle gradlew* settings.gradle store/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ echo $HOME
/c/Users/GGG
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ export HELLO=cos
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ echo $HELLO
cos
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ ls
README.md gradle/ gradlew.bat src/
build.gradle gradlew* settings.gradle store/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ ./gradlew clean build
Downloading https://services.gradle.org/distributions/gradle-8.5-bin.zip
............10%.............20%............30%.............40%.............50%............60%.............70%.............80%............90%.............100%
Welcome to Gradle 8.5!
Here are the highlights of this release:
- Support for running on Java 21
- Faster first use with Kotlin DSL
- Improved error and warning messages
For more details see https://docs.gradle.org/8.5/release-notes.html
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 32s
5 actionable tasks: 4 executed, 1 up-to-date
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ ls
README.md build.gradle gradlew* settings.gradle store/
build/ gradle/ gradlew.bat src/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ cd build
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build (master)
$ ls
classes/ generated/ libs/ resolvedMainClassName resources/ tmp/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build (master)
$ cd libs
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build/libs (master)
$ ls
spring-blog-river-0.0.1-SNAPSHOT.jar
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build/libs (master)
$ java -jar spring-blog-river-0.0.1-SNAPSHOT.jar
순서 대로 설명
1.Git 클론:
git clone https://github.com/samsung-lec/spring-blog-crud-basic.git
GitHub에서
spring-blog-crud-basic
프로젝트를 로컬로 클론하여 작업 디렉토리에 가져왔습니다.2.디렉토리 이동 및 Gradle 빌드:
클론한 프로젝트 디렉토리로 이동하여 Gradle 빌드 도구를 사용해 프로젝트를 빌드했습니다.
./gradlew clean build

3.빌드 결과 확인:
빌드가 성공한 후, 빌드된 JAR 파일을 확인하기 위해
build/libs
디렉토리로 이동하여 빌드된 파일을 확인했습니다.GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic (master)
$ cd build
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build (master)
$ ls
classes/ generated/ libs/ resolvedMainClassName resources/ tmp/
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build (master)
$ cd libs
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build/libs (master)
$ ls
spring-blog-river-0.0.1-SNAPSHOT.jar
spring-blog-river-0.0.1-SNAPSHOT.jar
라는 JAR 파일이 생성된 것을 확인할 수 있었습니다4.JAR 파일 실행:
마지막으로 JAR 파일을 실행했습니다.
java -jar spring-blog-river-0.0.1-SNAPSHOT.jar
이 명령어는 Spring Boot 애플리케이션을 실행시키는 명령어입니다. 해당 JAR 파일이 Spring Boot 애플리케이션을 포함하고 있으므로, Java 명령어를 통해 애플리케이션을 실행하게 됩니다.
추가 설명:
./gradlew clean build
:clean
은 이전 빌드된 파일들을 삭제하고,build
는 새롭게 프로젝트를 빌드하는 과정입니다. 이 과정에서 소스 코드가 컴파일되고, 테스트가 실행되며, 실행 가능한 JAR 파일이 생성됩니다.
java -jar
명령어: 이 명령어는 Java로 빌드된 실행 가능한 JAR 파일을 실행하는 데 사용됩니다. 해당 JAR 파일 안에는 Spring Boot 애플리케이션이 들어 있으며, 실행되면 애플리케이션이 구동됩니다.
실행 후에 서버가 정상적으로 동작하는지 확인하려면 로그를 확인하거나, 애플리케이션이 실행되는 포트(기본적으로 8080)에 접근해 서버 상태를 확인할 수 있습니다. 예를 들어,
http://localhost:8080
을 브라우저에 입력해 애플리케이션이 제대로 실행되는지 확인할 수 있습니다.2. 서버 실행 git Bash
GGG@DESKTOP-43CC23G MINGW64 /c/metacoding/mywork(jar)/spring-blog-crud-basic/build/libs (master)
$ java -jar spring-blog-river-0.0.1-SNAPSHOT.jar
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v3.1.5)
2024-10-10T10:29:25.800+09:00 INFO 14200 --- [ main] s.m.s.SpringBlogRiverApplication : Starting SpringBlogRiverApplication v0.0.1-SNAPSHOT using Java 21.0.2 with PID 14200 (C:\metacoding\mywork(jar)\spring-blog-crud-basic\build\libs\spring-blog-river-0.0.1-SNAPSHOT.jar started by GGG in C:\metacoding\mywork(jar)\spring-blog-crud-basic\build\libs)
2024-10-10T10:29:25.802+09:00 INFO 14200 --- [ main] s.m.s.SpringBlogRiverApplication : No active profile set, falling back to 1 default profile: "default"
2024-10-10T10:29:26.265+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2024-10-10T10:29:26.265+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-10-10T10:29:26.359+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 87 ms. Found 1 JPA repository interfaces.
2024-10-10T10:29:26.375+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
2024-10-10T10:29:26.375+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2024-10-10T10:29:26.390+09:00 INFO 14200 --- [ main] .RepositoryConfigurationExtensionSupport : Spring Data Redis - Could not safely identify store assignment for repository candidate interface shop.mtcoding.springblogriver.post.PostRepository; If you want this repository to be a Redis repository, consider annotating your entities with one of these annotations: org.springframework.data.redis.core.RedisHash (preferred), or consider extending one of the following types with your repository: org.springframework.data.keyvalue.repository.KeyValueRepository
2024-10-10T10:29:26.390+09:00 INFO 14200 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces.
2024-10-10T10:29:26.890+09:00 INFO 14200 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2024-10-10T10:29:26.906+09:00 INFO 14200 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2024-10-10T10:29:26.906+09:00 INFO 14200 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.15]
2024-10-10T10:29:26.968+09:00 INFO 14200 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2024-10-10T10:29:26.968+09:00 INFO 14200 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1133 ms
2024-10-10T10:29:27.000+09:00 INFO 14200 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2024-10-10T10:29:27.109+09:00 INFO 14200 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:test user=SA
2024-10-10T10:29:27.109+09:00 INFO 14200 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2024-10-10T10:29:27.129+09:00 INFO 14200 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:test'
2024-10-10T10:29:27.239+09:00 INFO 14200 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-10-10T10:29:27.270+09:00 INFO 14200 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 6.2.13.Final
2024-10-10T10:29:27.270+09:00 INFO 14200 --- [ main] org.hibernate.cfg.Environment : HHH000406: Using bytecode reflection optimizer
2024-10-10T10:29:27.427+09:00 INFO 14200 --- [ main] o.s.o.j.p.SpringPersistenceUnitInfo : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-10-10T10:29:27.927+09:00 INFO 14200 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
Hibernate:
drop table if exists post_tb cascade
Hibernate:
create table post_tb (
id integer generated by default as identity,
created_at timestamp(6) not null,
updated_at timestamp(6) not null,
title varchar(100) not null,
content clob not null,
primary key (id)
)
2024-10-10T10:29:27.942+09:00 INFO 14200 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-10-10T10:29:28.067+09:00 INFO 14200 --- [ main] o.s.d.j.r.query.QueryEnhancerFactory : Hibernate is in classpath; If applicable, HQL parser will be used.
2024-10-10T10:29:28.914+09:00 INFO 14200 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2024-10-10T10:29:28.914+09:00 INFO 14200 --- [ main] s.m.s.SpringBlogRiverApplication : Started SpringBlogRiverApplication in 3.406 seconds (process running for 3.736)
3. DMZ 개방
DMZ는 보안 영역을 설정하는 네트워크 구성 방식 중 하나로, 인터넷에서 내부 네트워크로 직접 접근을 차단하고, 외부와 내부 네트워크 사이에 중간 영역을 두어 외부 접속이 허용된 서버를 배치하는 것입니다.
DMZ의 역할
DMZ는 주로 외부에 노출되는 웹 서버, 이메일 서버, FTP 서버 등을 보호하기 위해 사용됩니다. 외부에서 DMZ에 있는 서버에 접근은 가능하지만, 내부 네트워크는 보호됩니다. 즉, DMZ에 배치된 서버는 외부 네트워크(인터넷)와 내부 네트워크 사이에 중간 지대처럼 위치하게 되며, 외부와 내부 양쪽의 보안을 어느 정도 유지할 수 있게 됩니다.
DMZ 개방의 의미
DMZ를 개방한다는 것은 특정 서버에 대해 외부 네트워크에서의 접근을 허용하는 설정을 의미합니다. 이때 다음과 같은 시나리오가 가능합니다:
- 모든 포트를 개방하는 것: 특정 서버에 대해 외부의 모든 포트 접근을 허용하는 방식입니다. 이는 매우 위험할 수 있습니다. 왜냐하면, 악성 행위자가 특정 취약 포트를 공격할 가능성이 있기 때문입니다.
- 특정 포트만 개방하는 것: 일반적으로 더 안전한 방법은 특정 포트만 개방하는 것입니다. 예를 들어, 웹 서버는 80번(HTTP) 또는 443번(HTTPS) 포트만 개방하고, 다른 포트는 차단하는 방식입니다.
요약
- DMZ 개방은 특정 장비나 서버가 외부 네트워크로부터 접근 가능하도록 만드는 설정입니다.
- 모든 포트를 여는 것과 DMZ 개방이 동일하지 않습니다. 모든 포트를 여는 것은 DMZ 개방을 넘어서서 매우 위험한 설정일 수 있습니다.
- 일반적으로 DMZ에서는 필요한 포트만 선택적으로 개방하는 것이 보안상 바람직합니다.
모든 포트를 여는 것은 주의가 필요하며, 보안 위험이 크게 증가할 수 있으므로 가능하면 필요한 포트만 제한적으로 개방하는 것이 좋습니다.
4. 인바운드 (Inbound): NAGATIVE 방식,아웃바운드 (Outbound): POSITIVE 방식
인바운드 (Inbound): NAGATIVE 방식
- 인바운드 트래픽은 외부에서 내부 네트워크로 들어오는 트래픽을 의미합니다.
- NAGATIVE(부정적) 방식에서 인바운드 트래픽은 기본적으로 차단됩니다. 즉, 외부에서 내부 네트워크로 들어오는 모든 연결 요청은 막힙니다.
- 이 방식에서는 네트워크 관리자가 허용할 트래픽을 선택적으로 열어줍니다. 예를 들어, 외부에서 특정 서버(예: 웹 서버)에 접속할 수 있도록 80번 포트(HTTP)나 443번 포트(HTTPS)를 열어줄 수 있습니다.
- 기본적으로 외부에서 들어오는 모든 요청을 부정(거부)하고, 필요한 요청만 긍정(허용)하는 방식입니다.
예시:
- 외부 사용자가 내부 웹 서버에 접속하려 할 때, 보안 설정에 의해 기본적으로 모든 외부 접근이 차단되지만, 관리자가 80번과 443번 포트를 열어두었기 때문에 웹 서버로의 접속만 허용됩니다.
2. 아웃바운드 (Outbound): POSITIVE 방식
- 아웃바운드 트래픽은 내부 네트워크에서 외부로 나가는 트래픽을 의미합니다.
- POSITIVE(긍정적) 방식에서는 아웃바운드 트래픽이 기본적으로 허용됩니다. 즉, 내부 네트워크에 있는 장치나 사용자들은 외부로 나가는 모든 연결 요청을 할 수 있습니다.
- 내부에서 외부로의 연결은 자유롭게 이루어질 수 있으며, 관리자가 특정 목적이나 트래픽을 차단할 필요가 있을 때만 예외적으로 차단합니다.
예시:
- 내부 사용자가 인터넷에 접속하여 웹사이트를 방문할 때, 아웃바운드 트래픽이 기본적으로 허용되기 때문에 인터넷 접속이 가능합니다. 다만, 네트워크 관리자가 특정 웹사이트나 서비스를 차단하고 싶다면, 해당 목적지로의 아웃바운드 트래픽을 제한할 수 있습니다.
요약
- 인바운드(NAGATIVE 방식): 외부에서 내부로 들어오는 트래픽은 기본적으로 차단되며, 필요한 트래픽만 허용합니다. 부정적인 접근, 즉 기본적으로는 차단하고 필요한 부분만 허용하는 방식을 의미합니다.
- 아웃바운드(POSITIVE 방식): 내부에서 외부로 나가는 트래픽은 기본적으로 허용되며, 특별한 경우에만 차단할 수 있습니다. 긍정적인 접근, 즉 기본적으로는 허용하고, 필요시 제한하는 방식을 의미합니다.
이러한 방식은 네트워크 보안에서 매우 중요한 개념이며, 인바운드와 아웃바운드 트래픽을 적절히 관리하여 보안을 강화하는 데 기여할 수 있습니다.
Share article