Community

게시판

자유롭게 글을 작성하고, 지식을 공유하며 소통하는 공간입니다.

지식 공유

Spring Boot 기본 사용법

```markdown # Spring Boot 기본 사용법 Spring Boot는 Java 플랫폼에서 신속하고 쉽게 애플리케이션을 개발할 수 있도록 돕는 프레임워크입니다. 이 블로그 게시글에서는 Spring Boot의 기본적인 사용법과 몇 가지 주요 기능에 대해 알아보겠습니다. 학습 목표는 최소한의 설정으로 애플리케이션을 시작하고, RESTful API를 구축하는 것입니다. ## Spring Boot 설정 Spring Boot를 시작하기 위해 필요한 기본 설정을 구성합니다. Spring Initializr를 사용하여 프로젝트를 생성하는 방법을 소개하겠습니다. 1. [Spring Initializr](https://start.spring.io/)에 접속합니다. 2. 다음과 같은 기준을 따라 프로젝트를 설정합니다: - Project: Maven Project - Language: Java - Spring Boot: 2.5.4 (최신 버전을 선택) - Dependecies: Spring Web 3. `Generate` 버튼을 클릭하여 ZIP 파일을 다운로드하고, 압축을 풀어 IDE에서 프로젝트를 엽니다. 그 다음, 기본 애플리케이션을 생성합니다. `src/main/java/com/example/demo/DemoApplication.java` 파일에 다음 코드를 추가합니다: ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` ## RESTful API 구축 Spring Boot에서는 간단한 RESTful API를 만들 수 있습니다. 이를 위해 Controller 클래스를 추가하고, GET 요청을 처리하는 메서드를 정의해 보겠습니다. `src/main/java/com/example/demo/HelloController.java` 파일을 생성하고 다음 코드를 추가합니다: ```java package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello, Spring Boot!"; } } ``` 이제 비즈니스 로직이 구현된 상태로, HTTP GET 요청을 처리하는 `/hello` 엔드포인트가 생성되었습니다. 애플리케이션을 실행하면 Spring Boot가 내장된 톰캣 서버를 시작하고, 기본적으로 `http://localhost:8080/hello` URL에서 API를 테스트할 수 있습니다. 브라우저나 Postman을 사용하여 GET 요청을 보내면 "Hello, Spring Boot!"라는 응답을 확인할 수 있습니다. ## 결론 이 글에서는 Spring Boot의 기초적인 설정과 간단한 RESTful API 구축 방법에 대해 소개했습니다. Spring Boot는 설정의 간소화와 강력한 기능 덕분에 많은 개발자들에게 사랑받고 있습니다. 이제 여러분은 Spring Boot의 기본 모습을 이해했으니, 더 깊이 있는 기능들을 탐색해 보시기 바랍니다. 데이터베이스 연동, 보안 설정, 테스트 등 다양한 기능들을 활용하여 더욱 완성도 높은 애플리케이션을 개발할 수 있습니다. ```

지식 공유

폐쇄망에서 웹서버(Apache) 구성하기

## Docker OS 컨테이너 준비 1. 이미지를 받는다. [rocky linux 8.10] docker pull rockylinux/rockylinux:8.10 2. 편하게 작업 할 컨테이너를 하나 띄우고 쉘로 접근한다. docker run -it --name rocky-localrepo rockylinux/rockylinux:8.10 /bin/bash ## 어떤 패키지를 오프라인에서 설치하게 만들지 정한다. 우리가 미리 받아오는 RPM 목록이 곧 그쪽이 쓸 수 있는 설치 가능 목록이 된다. 예시로 httpd, mod\_ssl, php, openssl, vim, 이런 식으로 결정한다고 하자. 참고로 Rocky Linux에서 의존성까지 같이 받아오려면 dnf download를 쓴다. 1. 필요한 유틸 설치 dnf install -y dnf-plugins-core createrepo tar * dnf-plugins-core 안에 dnf download 들어있다. * createrepo는 로컬 리포지토리 메타데이터 만드는 툴. * tar는 마지막에 묶어서 전달 2. RPM들을 모아 둘 디렉토리 생성 mkdir -p /repo/base cd /repo/base 3. 의존성 가져오기 dnf download --resolve httpd * --resolve를 붙이면 httpd가 필요로 하는 의존 라이브러리까지 전부 rpm 파일로 같이 떨어진다. 원하는 다른 패키지도 계속 추가로 긁어올 수 있다. * dnf download --resolve mod\_ssl * dnf download --resolve php * dnf download --resolve openssl * dnf download --resolve vim-enhanced ## 핵심 요약 1. Windows에서: * docker run -it rockylinux:8.10 * 컨테이너 안에서 dnf install -y dnf-plugins-core createrepo tar * /repo/base 폴더 만들고 dnf download --resolve <원하는패키지들> * createrepo /repo/base * /repo/local-httpd.repo 만들어두기 * tar czvf /repo\_bundle.tgz /repo * docker cp로 호스트로 꺼냄 2. 폐쇄망 Rocky 서버에서: * /opt/localrepo 에 압축 풀기 * /etc/yum.repos.d/ 에 .repo 복사 * dnf install <패키지> 테스트 # 리버스 프록시 설정 ### httpd.conf LoadModule proxy\_module modules/mod\_proxy.so LoadModule proxy\_http\_module modules/mod\_proxy\_http.so LoadModule ssl\_module modules/mod\_ssl.so <VirtualHost \*:21443> ServerName otp.pola.or.kr ``` SSLEngine on SSLCertificateFile /path/to/otp.pola.or.kr.crt SSLCertificateKeyFile /path/to/otp.pola.or.kr.key SSLCertificateChainFile /path/to/chain.pem # ↑ DMZ 웹서버가 직접 HTTPS를 종료(terminate)해야 하니까 인증서는 DMZ에 있어야 해 # 클라이언트가 /sln/... 으로 들어온 요청을 내부망 sso.pola.or.kr로 프록시 ProxyPreserveHost On ProxyPass /sln/ https://sso.pola.or.kr/sln/ ProxyPassReverse /sln/ https://sso.pola.or.kr/sln/ # (선택) 특정 URI만 보낼 수도 있음. 예: /sln/pola/user/regist/step 만 # ProxyPass /sln/pola/user/regist/step https://sso.pola.or.kr/sln/pola/user/regist/step # ProxyPassReverse /sln/pola/user/regist/step https://sso.pola.or.kr/sln/pola/user/regist/step # 보안 헤더 같은 것도 보통 여기서 달아줌 RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s RequestHeader set X-Forwarded-Host %{HOST}s ```

지식 공유

WEB(Apache) WAS(Tomcat) Reserve Proxy 방식 연동하기

## 기본 개념 1. 사용자는 https://example.com (80/443, Apache로 진입) 2. Apache가 받아서 내부의 Tomcat으로 대신 요청을 보내줌 (http://127.0.0.1:8080) 3. Apache는 Tomcat 응답을 다시 클라이언트에게 전달 *** ## Tomcat 준비 conf/server.xml안에 설정 ``` <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ``` ## Apache httpd 모듈 켜기 리눅스 계열(예: Rocky/Ubuntu 등)은 보통 /etc/httpd 또는 /etc/apache2 아래 있고, 윈도우면 Apache24/conf/httpd.conf 안에 모듈 로드하는 라인이 있다. ``` LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule headers_module modules/mod_headers.so ``` mod\_headers는 나중에 Server 헤더 같은 거 숨길 때 쓸 거라 같이 켜두는 게 좋다. ## Apache 가상호스트(or httpd.conf)에 Reserve Proxy 설정 이제 Apache에게 "들어온 요청 그냥 Tomcat:8080으로 보내라" 라고 알려주면 끝. HTTP만 (80포트)인 경우 예시 아파치 설정 파일 어딘가(VirtualHost 블록) 혹은 그냥 httpd.conf에 아래 설정 추가 ``` <VirtualHost *:80> ServerName mysite.local # 외부에서 접속할 도메인/호스트명 (없어도 돌아가긴 함) # 클라이언트 -> Apache -> Tomcat ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ # (선택) Tomcat 서버 정보 숨기기 Header unset Server Header unset X-Powered-By # (선택) 정적 파일은 Apache가 직접 서빙하고 싶으면 이런 식으로 location(Directory) 따로 줄 수도 있음 # Alias /static/ "D:/web/static/" </VirtualHost> ``` 이렇게 하면: - 사용자가 http://mysite.local/board/list 로 접근 - Apache가 내부적으로 http://127.0.0.1:8080/board/list 로 요청 넘김 - 응답을 그대로 돌려줌 HTTPS까지 (443포트, SSL 인증서 Apache에 적용) 하는 경우 ``` <VirtualHost *:443> ServerName mysite.local SSLEngine on SSLCertificateFile "C:/Apache24/conf/ssl/mysite.crt" SSLCertificateKeyFile "C:/Apache24/conf/ssl/mysite.key" # 필요하면 중간체(체인) cert도 SSLCertificateChainFile 등으로 설정 ProxyPass / http://127.0.0.1:8080/ ProxyPassReverse / http://127.0.0.1:8080/ Header unset Server Header unset X-Powered-By </VirtualHost> ``` ## Apache 재시작 리눅스 (RHEL/Rocky/CentOS 계열 예): ``` sudo systemctl restart httpd ``` Ubuntu 계열은: ``` sudo systemctl restart apache2 ```