-
Spring์์๋
Servlet๊ณผDispatcherServlet์ด ์น ์์ฒญ ์ฒ๋ฆฌ์์ ํต์ฌ์ ์ธ ์ญํ ์ ํด์. ๊ฐ๋ ์ ํ๋์ฉ ๋ช ํํ ์ ๋ฆฌํด๋ณผ๊ฒ์.
๐งฑ 1. Servlet์ด๋?
โ ์ ์
- ์๋ฐ ์น์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋ํธ
- HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , HTTP ์๋ต์ ๋ฐํํ๋ ์๋ฐ ํด๋์ค
- ํฐ์บฃ(Tomcat) ๊ฐ์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์คํ๋จ
โ ์ญํ
- ์น ๋ธ๋ผ์ฐ์ ์์ ์จ ์์ฒญ์ ๋ฐ์์ ์ฒ๋ฆฌํ๊ณ , ์๋ต์ ์์ฑํจ
- ์์ ์๋ ๋ชจ๋ ์์ฒญ์ ์ง์ Servlet์์ ์ฒ๋ฆฌํ์ด์.
@WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) { response.getWriter().write("Hello from Servlet!"); } }์ด๊ฑด ๊ฑฐ์ Spring ์ด์ ์ ์ ํต์ ์ธ ์น ๋ฐฉ์์ด์์.
CreatedWed, 26 Mar 2025 08:19:45 +0900 -
Spring Boot์์ Filter์ Interceptor๋ ๋ชจ๋ ์์ฒญ(Request)๊ณผ ์๋ต(Response)์ ๊ฐ๋ก์ฑ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ด์ง๋ง, ์ญํ , ์คํ ์์ , ์ ์ฉ ๋ฒ์์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์๋์์ ๊ฐ๋จ + ์์์ ํจ๊ป ์ ๋ฆฌํด๋ณผ๊ฒ์.
๐น 1. Filter (์๋ธ๋ฆฟ ํํฐ)
โ ๊ฐ์
- Servlet ์คํ์ ์ ์๋ ๊ธฐ๋ฅ
- Spring๋ณด๋ค ๋ ํ์ ๋ ๋ฒจ
- DispatcherServlet ์ด์ ์ ์คํ๋จ
โ ์ฌ์ฉ ์์
- ์ธ์ฆ, ์ธ์ฝ๋ฉ, ๋ก๊น , XSS ๋ฐฉ์ด
- ๊ณตํต ์ ์ฒ๋ฆฌ/ํ์ฒ๋ฆฌ
โ ์์
@Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Filter: ์์ฒญ ์ "); chain.doFilter(request, response); System.out.println("Filter: ์๋ต ํ"); } }
๐น 2. Interceptor (์คํ๋ง ์ธํฐ์ ํฐ)
โ ๊ฐ์
- Spring MVC์ ๊ธฐ๋ฅ
- DispatcherServlet ์ดํ์ ๋์
- ์ฃผ๋ก ์ปจํธ๋กค๋ฌ ์ง์ ์ /ํ์ ๋ก์ง ์ ์ฉ
โ ์ฌ์ฉ ์์
- ๋ก๊ทธ์ธ ์ฒดํฌ
- ๊ถํ ๊ฒ์ฌ
- ์์ฒญ ๋ก๊น
- ๊ณตํต ์๋ต ๊ฐ๊ณต
โ ์์
public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("Interceptor: ์ปจํธ๋กค๋ฌ ํธ์ถ ์ "); return true; // false๋ฉด ์ปจํธ๋กค๋ฌ๋ก ์ ๋์ด๊ฐ } }๊ทธ๋ฆฌ๊ณ ๋ฑ๋ก์ ์ด๋ ๊ฒ ํด์ผ ํด์:
CreatedWed, 26 Mar 2025 08:15:45 +0900 -
github action sample
spring boot
-
gradle build๋ฅผ ์ฌ์ฉํ๋ spring boot๋ฅผ ๋น๋ํ๊ณ ssh๋ก
-
secret ๋ฅ๋ setting-> security์ Secrets and variables ๋ด action ๋ฉ๋ด์์ ์ค์
-
๋ง์ง๋ง์ slack webhook์ผ๋ก ๋ฐฐํฌ ์ํฉ ์๋ฆผ
-
action ์ค์ ์ด๋ slack webhoook url ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์๋ ๋ง์ผ๋ ์๋ตํ๊ฒ ์ต๋๋ค.
name: Build and Deploy on: push: branches: - develop jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. SSH ํธ์คํธ ํค ์ถ๊ฐ - name: Add SSH known hosts run: | mkdir -p ~/.ssh ssh-keyscan -H github.com >> ~/.ssh/known_hosts # 2. ๋ฆฌํฌ์งํ ๋ฆฌ ์ฒดํฌ์์ (์๋ธ๋ชจ๋ ํฌํจ) - name: Checkout repository with submodules uses: actions/checkout@v3 with: submodules: recursive ssh-key: ${{ secrets.PRIVATE_KEY_FOR_SUBMODULE }} fetch-depth: 0 # 3. ์๋ธ๋ชจ๋ ์ต์ ํ - name: Update submodules to the latest run: | git submodule update --init --recursive git submodule foreach git pull origin $(git rev-parse --abbrev-ref HEAD) # 4. JDK ์ค์ - name: Set up JDK 23 uses: actions/setup-java@v3 with: java-version: '23' distribution: 'temurin' # 5. Gradle ๋น๋ - name: Build with Gradle run: ./gradlew clean build -x test # 6. ์๋ฒ๋ก ํ์ผ ์ ์ก - name: Deploy to Server env: SSH_PRIVATE_KEY: ${{ secrets.DEV_SSH_PRIVATE_KEY }} DEPLOY_SERVER_IP: ${{ secrets.DEV_SERVER_IP }} DEPLOY_SERVER_USER: ${{ secrets.DEV_SERVER_USER }} run: | echo "DEPLOY_SERVER_IP: $DEPLOY_SERVER_IP" mkdir -p ~/.ssh echo "$SSH_PRIVATE_KEY" > ~/.ssh/github_action chmod 600 ~/.ssh/github_action ssh-keyscan -H "$DEPLOY_SERVER_IP" >> ~/.ssh/known_hosts # ๋น๋ ํ์ผ ์ ์ก scp -i ~/.ssh/github_action build/libs/*.jar $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/backend/ # swagger rest doc json # scp -i ~/.ssh/github_action build/resources/main/restdocs/*.json $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/swagger-docs/ find build/resources/main/restdocs -name "*.json" | grep . && scp -i ~/.ssh/github_action build/resources/main/restdocs/*.json $DEPLOY_SERVER_USER@$DEPLOY_SERVER_IP:/home/$DEPLOY_SERVER_USER/swagger-docs/ || echo "No JSON files to copy, skipping..." # 7. ์๋ฒ์์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ - name: Start Application env: DEPLOY_SERVER_IP: ${{ secrets.DEV_SERVER_IP }} SERVER_USER: ${{ secrets.DEV_SERVER_USER }} REPOSITORY_NAME: ${{ github.repository }} run: | PROJECT_NAME=$(echo $REPOSITORY_NAME | cut -d'/' -f2) ssh -i ~/.ssh/github_action $SERVER_USER@$DEPLOY_SERVER_IP << EOF cd /home/$SERVER_USER/backend chmod 700 /home/$SERVER_USER/backend/${PROJECT_NAME}*-exec.jar sh /home/$SERVER_USER/bin/deploy.sh $PROJECT_NAME dev /home/$SERVER_USER 512m sh /home/$SERVER_USER/infra/swagger/swagger_script.sh restart ${PROJECT}-api.json EOF - name: action-slack uses: 8398a7/action-slack@v3 with: status: ${{ job.status }} author_name: Pink Spider - dev fields: repo,commit,message,author # action,eventName,ref,workflow,job,took ์ถ๊ฐํ ์ ์์ mention: here if_mention: failure,cancelled env: SLACK_WEBHOOK_URL: ${{ secrets.DEV_SLACK_WEBHOOK_URL }} # required if: always() # Pick up events even if the job fails or is canceled. -
deploy.sh
CreatedTue, 25 Mar 2025 18:01:05 +0900 -
-
git history ์ ๋ถ ์์ ๊ณ reset ํ๋ ๋ฐฉ๋ฒ
- git history ๋ฅผ ์ ์์ ์ผ ํ ๊น?
- ์์ฃผ์๋ ์ผ์ ์๋์ง๋ง, git history๋ฅผ ์ ๋ถ ๋ ๋ฆฌ๊ณ reset ํด์ผ ํ ๋๊ฐ ์์ต๋๋ค..
- ์๋ฅผ ๋ค์ด, ์๋ฒ์ ๋น๋ฐ๋ฒํธ๋ ์๋ณตํธํ key, ๊ฐ์ธ์ ๋ณด ๋ฑ ๋ ธ์ถ๋๋ฉด ๋ฏผ๊ฐ์ ๋ณด๋ ํ์ผ๋ฑ์ด git์ ์ฌ๋ผ๊ฐ ๋ฒ๋ ธ๋ค๋ฉด?
- ํด๋น ๋ด์ฉ์ ์ง์ฐ๊ณ ๋ค์ commit & push๋ฅผ ํ์ง๋ง, history๋ฅผ ๋ณด๊ณ ์ด์ commit์ ๋ถ๋ฌ์ค๋ฉด ๊ทธ๋ง์ด๋ฏ๋ก, ํด๊ฒฐ์ฑ ์ด ๋ ์ ์์ง์.
- ์์ history๊น์ง ๋ ๋ ค๋ฒ๋ ค์ ์ด์ ์ ์ค์(๊ผญ ์ค์ํ์๋๋ง reset ํ๋ค๊ณ ํ ์๋ ์์ง๋ง)๋ฅผ ์ด๋ ฅ๊น์ง ์ง์์๋ค.
main ํน์ develop๋ฑ ๋จ๊ฒจ๋์ ๋ธ๋์น์์ (์ฌ๊ธฐ์ main)
- –orphan ์ ๊ธฐ์กด์ปค๋ฐ ์ด๋ ฅ์์ด…์ ์๋ฏธ์
๋๋ค. ์ฆ, ๊ธฐ์กด ์ด๋ ฅ์์ด ์์ํ๋ ๋ธ๋์น๋ฅผ ํ๋ ๋ง๋ญ๋๋ค.
git checkout --orphan latest_branch
์๋ก ์ปค๋ฐ
git add . git commit -m "initial commit after reset"๊ธฐ์กด ๋ธ๋์น ๋ ๋ฆฌ๊ณ ์๋ก ๋ง๋ฆ
git branch -D main git branch -m mainmain์ force pushํ๊ณ ๋ถํ์ํ ๋ด์ฉ ์ ๋ฆฌํด์ repo ์ต์ ํ
git push -f origin main git gc --aggressive --prune=all
CreatedMon, 24 Mar 2025 20:18:45 +0900 - git history ๋ฅผ ์ ์์ ์ผ ํ ๊น?
-
Clean Code 1์ฅ
ํด๋ฆฐ ์ฝ๋์ ์กฐ๊ฑด- ๋ด ๋๋ฆ์ ์ ๋ฆฌ
- 1์ฅ์์๋ ์๋ฐ๋ C ์ฐฝ์์๋ฑ ๊ฐ๋ฐ๊ณ์ ๊ฑฐ์ฅ๋ค์ด ์๊ฐํ๋ ์ข์ ์ฝ๋์ ๋ํ ๊ฒฌํด๋ฅผ ๋ชจ์๋์ ๋ถ๋ถ์ ๋๋ค.
- ๋ค์์ ์ด ๋ถ๋ค์ ์๊ฒฌ์์ ๋๋ฆ ๊ณตํต์ ์ธ ๋ถ๋ถ์ ์ถ๋ ค์ ๋ด ๋๋ฆ๋๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
- ์ฌ์ค์ ์ฑ ์ ์ฒด์ ๋ น์ ์๋ ๋ด์ฉ์ด๊ธฐ๋ ํฉ๋๋ค.
SARAM
-
S : Simple
- ๋ด ์๊ฒฌ : ์ฝ๋๋ ๋จ์ํด์ผ ํฉ๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ด ์ฝ๋์ ๋ น์๋ค๊ธฐ ์์ํ๋ฉด ํ๋ก์ ํธ ์์ฒด๋ ๋ณต์กํด์ง๋๋ค. ์ฝ๋(ํด๋์ค, ๋ฉ์๋ ์ฐจ์)์ด๋ผ๋ ์ฌํํด์ผ ํฉ๋๋ค.
-
A : Atomic
CreatedSat, 22 Mar 2025 20:16:08 +0900 -
AES ์๋ณตํธํ๋ฅผ ์ํ key์์ฑ ์ฝ๋๋ก ๋ง๋ค๊ธฐ
Contents
AES ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ฌ.
- ์๋ณตํธํ๊ฐ ๊ฐ๋ฅํ ๋ํ์ ์ธ ์๋ฐฉํฅ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ์๋ฃ์์ผ๋ก ์ฐพ์๋ณด๋ฉด AES(Advanced Encryption Standard)๋ ๋์นญ ํค ์ํธํ ๋ฐฉ์์ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ๋ฏธ๊ตญ ๊ตญ๋ฆฝํ์ค๊ธฐ์ ์ฐ๊ตฌ์(NIST)์ ์ํด 2001๋ ํ์ค์ผ๋ก ์ฑํ๋์์ต๋๋ค. Rijndael ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์์ผ๋ฉฐ, ๋์ ๋ณด์์ฑ๊ณผ ๋น ๋ฅธ ์ฑ๋ฅ ๋๋ถ์ ๋ค์ํ ๋ณด์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
AES ํน์ง
- ๋์นญ ํค ์ํธํ: ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ํธํ ๋ฐ ๋ณตํธํํฉ๋๋ค.
- ๊ณ ์ ๋ ๋ธ๋ก ํฌ๊ธฐ: AES๋ 128๋นํธ ๋ธ๋ก ํฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ค์ํ ํค ๊ธธ์ด ์ง์: 128๋นํธ, 192๋นํธ, 256๋นํธ ํค ๊ธธ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณด์์ฑ: ๊ธฐ์กด์ DES(Data Encryption Standard)๋ณด๋ค ๊ฐ๋ ฅํ ๋ณด์์ฑ์ ์๋ํฉ๋๋ค.
- ๋น ๋ฅธ ์๋: ์ํํธ์จ์ด ๋ฐ ํ๋์จ์ด์์ ํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
AES ์ํธํ ๊ณผ์
-
AES ์ํธํ๋ ์ฌ๋ฌ ๋ผ์ด๋(Round)์ ์ฐ์ฐ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ์ฉ๋๋ ํค ๊ธธ์ด์ ๋ฐ๋ผ ๋ผ์ด๋ ์๊ฐ ๋ฌ๋ผ์ง๋๋ค.
CreatedThu, 20 Mar 2025 16:18:45 +0900