728x90
๋ฐ˜์‘ํ˜•

 

์‹œํ๋ฆฌํ‹ฐ ๋ฒ„์ „๋ณ„ ํŠน์„ฑ

 

: ์Šคํ”„๋ง์€ ๋ฒ„์ „์— ๋”ฐ๋ผ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ๋˜๋Š”๋ฐ ์‹œํ๋ฆฌํ‹ฐ์˜ ๊ฒฝ์šฐ ํŠนํžˆ ์„ธ๋ถ€ ๋ฒ„์ „๋ณ„๋กœ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„์ „๋งˆ๋‹ค ๊ตฌํ˜„ ํŠน์ง•์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค

 

์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์ถœ์‹œ๋  ๋•Œ๋งˆ๋‹ค GitHub์˜ Spring ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ Security์˜ Release ํ•ญ๋ชฉ์„ ํ†ตํ•ด ๋ณ€๊ฒฝ๋œ ์ ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

Releases · spring-projects/spring-security (github.com)

 

Releases · spring-projects/spring-security

Spring Security. Contribute to spring-projects/spring-security development by creating an account on GitHub.

github.com

 

 

 

์ฃผ์š” ๋ฒ„์ „๋ณ„ ๊ตฌํ˜„

 

- ์Šคํ”„๋ง ๋ถ€ํŠธ 2.X.X ~ 2.6.X (์Šคํ”„๋ง 5.X.X ~ 5.6.X)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

				http
	        .authorizeRequests()
            .antMatchers("/").authenticated()
            .anyRequest().permitAll();

    }
}

 

- ์Šคํ”„๋ง ๋ถ€ํŠธ 2.7.X ~ 3,0.X (์Šคํ”„๋ง 5.7.X M2 ~ 6.0.X)

public class SpringSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http
						.authorizeHttpRequests()
			            .requestMatchers("/admin").hasRole("ADMIN")
			            .anyRequest().authenticated();

        return http.build();
    }
}

 

- ์Šคํ”„๋ง ๋ถ€ํŠธ 3.1.X ~ (์Šคํ”„๋ง 6.1.X ~) 

public class SpringSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http
            .authorizeHttpRequests((auth) -> auth
                  .requestMatchers("/login", "/join").permitAll()
                  .anyRequest().authenticated()
        );

        return http.build();
    }
}

 

** 3.1.X ๋ฒ„์ „๋ถ€ํ„ฐ ๋žŒ๋‹คํ˜•์‹ ํ‘œํ˜„ ํ•„์ˆ˜...

 

 

Config ์„ค์ • ํ›„ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

 

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ Config ํด๋ž˜์Šค ์„ค์ • ํ›„ ํŠน์ • ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŒ… ๋˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜ ํŽ˜์ด์ง€๊ฐ€ ๋ฐœ์ƒ....

 

์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Config ํด๋ž˜์Šค๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์„ค์ •๋„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

 

์ปค์Šคํ…€ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ :  mustache

 

- login.mustache

- ๋กœ๊ทธ์ธ : ์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ POST ์š”์ฒญ ๊ฒฝ๋กœ

 

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    login page
    <hr>
    <form action="/loginProc" method="post" name="loginForm">
        <input id="username" type="text" name="username" placeholder="id"/>
        <input id="password" type="password" name="password" placeholder="password"/>
        <input type="submit" value="login"/>
    </form>
</body>
</html>

 

 

LoginController

package com.example.testsecurity.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LoginController {

    @GetMapping("/login")
    public String loginP() {

        return "login";
    }
}

 

 

Security Config ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์„ค์ • ๋ฐ ๋กœ๊ทธ์ธ ๊ฒฝ๋กœ

 

 

admin ํŽ˜์ด์ง€๋กœ ๊ฐ€๋„ ๋ฐ”๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •..

package com.example.testsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

        http
                .authorizeHttpRequests((auth) -> auth
                        .requestMatchers("/", "/login", "/loginProc").permitAll()
                        .requestMatchers("/admin").hasRole("ADMIN")
                        .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
                        .anyRequest().authenticated()
                );

		
        // ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ถ”๊ฐ€ํ•˜๊ธฐ
        http
                .formLogin((auth) -> auth.loginPage("/login")
                        .loginProcessingUrl("/loginProc")
                        .permitAll()
                );
		
        // ํ† ํฐ์„ ๋ณด๋‚ด์ง€ ์•Š์œผ๋ฉด ๋กœ๊ทธ์ธ์ด ์ง„ํ–‰์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”ํ›„์— ํ‘ผ๋‹ค๊ณ  ํ•˜์‹ฌ...
        http
                .csrf((auth) -> auth.disable());


        return http.build();
    }
}

 

 

๊ทผ๋ฐ mustache ์™œ ์”€??

=> https://velog.io/@qowl880/SpringBoot-Mustache

 

[SpringBoot(2)] Mustache

์ด์ „๊นŒ์ง€ ์ง„ํ–‰ํ–ˆ๋˜ ์‹ค์Šต์€ ๊ธฐ๋Šฅ๋งŒ ๋„ฃ์–ด APIํ†ต์‹ ์„ swagger๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ €๊ฐ€ ๋ณผ์ˆ˜์žˆ๋Š” viewํ™”๋ฉด์œผ๋กœ ์ถœ๋ ฅ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค

velog.io

 

 

์‹œํ๋ฆฌํ‹ฐ ์•”ํ˜ธํ™”

 

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ(๋กœ๊ทธ์ธ) ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ๋Œ€ํ•ด ๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ์•”ํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋Œ€์กฐ๋œ๋‹ค. 

๋”ฐ๋ผ์„œ ํšŒ์›๊ฐ€์ž…์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ ์•”ํ˜ธํ™”๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค

 

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด BCrypt Password Encorder๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๊ถŒ์žฅํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ return ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด @Bean ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค

 

 

๋‹จ๋ฐฉํ–ฅ ํ•ด์‹œ ์•”ํ˜ธํ™”

 

- ์–‘๋ฐฉํ–ฅ(๋Œ€์นญํ‚ค, ๋น„๋Œ€์นญํ‚ค)

- ๋‹จ๋ฐฉํ–ฅ(ํ—ค์‹œ)

 

 

Security Config ์•”ํ˜ธํ™” Bean ์ถ”๊ฐ€

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {

    return new BCryptPasswordEncoder();
}

 

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜์™€ ORM

 

ํšŒ์› ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” MYSQL ์—”์ง„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ ‘๊ทผ์€ Spring Date JPA ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

 

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜์กด์„ฑ

dependencies {

    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.mysql:mysql-connector-j'
}

 

 

๋ณ€์ˆ˜ ์„ค์ •

  • application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://์•„์ดํ”ผ:3306/๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค?useSSL=false&useUnicode=true&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true
spring.datasource.username=์•„์ด๋””
spring.datasource.password=๋น„๋ฐ€๋ฒˆํ˜ธ

 

 

ํšŒ์›๊ฐ€์ž… ๋กœ์ง

 

ํšŒ์›์ •๋ณด๋ฅผ ํ†ตํ•ด ์ธ์ฆ ์ธ๊ฐ€ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํšŒ์› ๊ฐ€์ž…์„ ์ง„ํ–‰ํ•œ ๋’ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํšŒ์› ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค

 

 

ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ : mustache

 

- join.mustache

<form action="/joinProc" method="post" name="joinForm">
    <input type="text" name="username" placeholder="Username"/>
    <input type="password" name="password" placeholder="Password"/>
		<input type="submit" value="Join"/>
</form>

 

- JoinDTO

package com.example.testsecurity.dto;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class JoinDTO {

    private String username;
    private String password;
}

 

- JoinController

package com.example.testsecurity.controller;

import com.example.testsecurity.dto.JoinDTO;
import com.example.testsecurity.service.JoinService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class JoinController {

    @Autowired
    private JoinService joinService;


    @GetMapping("/join")
    public String joinP() {

        return "join";
    }


    @PostMapping("/joinProc")
    public String joinProcess(JoinDTO joinDTO) {

        System.out.println(joinDTO.getUsername());

        joinService.joinProcess(joinDTO);


        return "redirect:/login";
    }
}

 

- JoinService

package com.example.testsecurity.service;

import com.example.testsecurity.dto.JoinDTO;
import com.example.testsecurity.entity.UserEntity;
import com.example.testsecurity.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
public class JoinService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private BCryptPasswordEncoder bCryptPasswordEncoder;


    public void joinProcess(JoinDTO joinDTO) {


        //db์— ์ด๋ฏธ ๋™์ผํ•œ username์„ ๊ฐ€์ง„ ํšŒ์›์ด ์กด์žฌํ•˜๋Š”์ง€?


        UserEntity data = new UserEntity();

        data.setUsername(joinDTO.getUsername());
        data.setPassword(bCryptPasswordEncoder.encode(joinDTO.getPassword()));
        data.setRole("ROLE_USER");


        userRepository.save(data);
    }
}

 

 

 

-UserEntity

package com.example.testsecurity.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Entity
@Setter
@Getter
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String username;
    private String password;

    private String role;
}

 

 

Table ์ƒ์„ฑ : Hibernate ddl ์„ค์ •

 

- application properties

spring.jpa.hibernate.ddl-auto=none		// none์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ด๋ธ”์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์ง€๋กฑ
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

 

- UserRepository

package com.example.testsecurity.repository;

import com.example.testsecurity.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<UserEntity, Integer> {

}

 

- SecurityConfig ์ ‘๊ทผ ๊ถŒํ•œ

http
          .authorizeHttpRequests((auth) -> auth
                  .requestMatchers("/", "/login", "/loginProc", "/join", "/joinProc").permitAll()
                  .requestMatchers("/admin").hasRole("ADMIN")
                  .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
                  .anyRequest().authenticated()
          );

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹(Field Injection)

 

: @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ง์ ‘ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹

@Autowired
private JoinService joinService

 

์žฅ์ 

1. ๊ฐ„ํŽธํ•จ(ํ•„๋“œ, ์ƒ์„ฑ์ž ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ๊ฐ„๋‹จํžˆ ๋ถ™์—ฌ์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค /  ์ฝ”๋“œ๊ฐ€ ์งง๊ณ , ์ง๊ด€์ ์ด๋ฉฐ ์„ค์ •์ด ๊ฐ„๋‹จํ•˜๋‹ค)

2. ์œ ์—ฐ์„ฑ(ํ•„๋“œ, ์ƒ์„ฑ์ž, ์„ธํ„ฐ ๋ฉ”์„œ๋“œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค / ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ฃผ์ž… ๋ฐฉ์‹์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค)

 

์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹(Constructor Injection)

 

: ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฃผ์ž…ํ•  ์˜์กด์„ฑ์„ ์ƒ์„ฑ์ž์˜ ๋งค๊ฒŒ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค...

private final JoinService joinService;

@Autowired
public YourClassName(JoinService joinService) {
    this.joinService = joinService;
}

 

 

๊ทผ๋ฐ ์™œ... ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์ด ๋” ์ข‹์„๊นŒ์š”??

 

 

1.๋ถˆ๋ณ€์„ฑ(Immutability)

- ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹์—์„œ๋Š” private ํ•„๋“œ๊ฐ€ final์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ์ž…๋œ ์˜์กด์„ฑ์„ final๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค

- ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค

 

2. ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ

- ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹œ์— ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํ”Œ๋ ‰์…˜์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ˆœํžˆ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค

- ์ด๋ฅผ ํ†ตํ•ด ๋” ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

3. ์ˆœํ™˜ ์˜์กด์„ฑ ๋ฐฉ์ง€

- ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ˆœํ™˜ ์˜์กด์„ฑ์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋” ๋ช…ํ™•ํ•œ ์˜์กด์„ฑ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

- ํ•„๋“œ ์ฃผ์ž…์ด๋‚˜ setter ์ฃผ์ž… ๋ฐฉ์‹์—์„œ๋Š” ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

 

4. ๋ช…์‹œ์  ์˜์กด์„ฑ

- ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ์˜์กด์„ฑ์„ ํ•„์š”๋กœ ํ•˜๋Š”์ง€ ๋ช…์‹œ์ ์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.

- ๋ฐ˜๋ฉด ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹์€ ์˜์กด์„ฑ์„ ํด๋ž˜์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์•Œ ์ˆ˜ ์žˆ์–ด, ์˜์กด์„ฑ์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค

 

=> ๊ฒฐ๋ก 

@Authowired  ์–ด๋…ธํ…Œ์ด์…˜์€ ์‚ฌ์šฉ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ด์–ด์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ํ•„๋“œ ์ฃผ์ž… ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์€ ๊ฐ์ฒด์˜ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์ฝ”๋“œ์˜ ๋ช…ํ™•์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๋ฉฐ, ์ˆœํ™˜ ์˜์กด์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ, ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์ด ๋” ๋งŽ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

 

728x90
๋ฐ˜์‘ํ˜•

'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Security ๊ณต๋ถ€ํ•˜๊ธฐ (1)  (0) 2024.05.20
728x90
๋ฐ˜์‘ํ˜•

***  ์ผ๋ฐ˜ + ์‹ ์œ ํ˜•

์˜ค๋ผํด, sql server ์ฐจ์ด ๋ด๋‘๊ธฐ

 

oracle์—์„œ ๋นˆ๋ฌธ์ž์—ด์€ null๋กœ ์ €์žฅ / sql server์—์„œ๋Š” ๋นˆ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜์–ด 

4๋ฒˆ์€ null์ด ์•„๋‹ˆ์ž๋‚˜... ๊ทธ๋ž˜์„œ ์กฐํšŒ๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค...

 

๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž ์šฐ์„ ์ˆœ์œ„ : NOT > AND > OR

 

null ์€ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๊ณ„์‚ฐํ•˜๋ฉด

 

1. (20 + 0) / 2 = 10

2. (20 + null (x)) / 1  = 20

3. (20 + null (x)) / 1  = 20

 

NVL(๋Œ€์ƒ๋ฐ์ดํ„ฐ , NULL์ผ๋•Œ ๋ฐ์ดํ„ฐ)

๊ฐ’์ด null ์ธ ๊ฒฝ์šฐ, 2๋ฒˆ์งธ ์ง€์ •๊ฐ’์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋Œ€์ƒ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

SELECT TOP(3) WITH TIES ํŒ€๋ช…, ์Šน๋ฆฌ๊ฑด์ˆ˜   // TOP(3) ๋งŒ ์ ๋Š”๋‹ค๋ฉด ๊ทธ๋ƒฅ 3๊ฐœ๋งŒ ์ถœ๋ ฅ
	FROM ํŒ€๋ณ„ ์„ฑ์ 
    ORDER BY ์Šน๋ฆฌ๊ฑด์ˆ˜ DESC;

 

=> 3๋ฒˆ์งธ ํ–‰๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ์ถ”๊ฐ€ ํ–‰์ด ์žˆ๋‹ค๋ฉด ์ด ํ–‰๋“ค๋„ ํฌํ•จ(SQL Server์—์„œ ์‚ฌ์šฉ)

 

SELECT ํŒ€๋ช…. ์Šน๋ฆฌ๊ฑด์ˆ˜
	FROM ํŒ€๋ณ„์„ฑ์ 
    WHERE ROWNM <= 3
    ORDER BY ์Šน๋ฆฌ๊ฑด์ˆ˜ DESC;

 

=> 3๋ฒˆ์งธ ํ–‰๊ณผ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง€ ์ถ”๊ฐ€ํ–‰์ด ์žˆ๋”๋ผ๋„ ํฌํ•จ x (Oracle์—์„œ ์‚ฌ์šฉ)

=> Oracle์—์„œ์„œ TOP(3) WITH TIES์™€ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด DENSE_RANK()์˜ ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

RANK()์™€ DENSE_RANK()์˜ ์ฐจ์ด....

 

EmployeeIDNameSalary

1 Alice 5000
2 Bob 4000
3 Carol 4000
4 Dave 3000
5 Eve 2000

RANK() ์‚ฌ์šฉ ์˜ˆ์‹œ

SELECT *
FROM (
    SELECT e.*, RANK() OVER (ORDER BY Salary DESC) AS rnk
    FROM Employees e
)
WHERE rnk <= 3;

 

EmployeeIDNameSalaryrnk

EmployeeID Name Salary rank
1 Alice 5000 1
2 Bob 4000 2
3 Carol 4000 2
4 Dave 3000 4

 

RANK() ํ•จ์ˆ˜๋Š” Salary๊ฐ€ ๊ฐ™์€ Bob๊ณผ Carol์—๊ฒŒ ๋™์ผํ•œ 2์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ๋‹ค์Œ ์ˆœ์œ„์ธ 3์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  4๋ฅผ Dave์—๊ฒŒ ๋ถ€์—ฌ

DENSE_RANK() ์‚ฌ์šฉ ์˜ˆ์‹œ

SELECT *
FROM (
    SELECT e.*, DENSE_RANK() OVER (ORDER BY Salary DESC) AS rnk
    FROM Employees e
)
WHERE rnk <= 3;

 

EmployeeIDNameSalaryrnk

1 Alice 5000 1
2 Bob 4000 2
3 Carol 4000 2
4 Dave 3000 3

DENSE_RANK() ํ•จ์ˆ˜๋Š” Salary๊ฐ€ ๊ฐ™์€ Bob๊ณผ Carol์—๊ฒŒ ๋™์ผํ•œ 2์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ , ๋‹ค์Œ ์ˆœ์œ„๋ฅผ 3์œผ๋กœ ๋ถ€์—ฌํ•˜์—ฌ ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

  • RANK(): ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋“ค์ด ์žˆ์œผ๋ฉด ์ˆœ์œ„์— ๊ณต๋ฐฑ์ด ์ƒ๊น๋‹ˆ๋‹ค.
  • DENSE_RANK(): ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋“ค์ด ์žˆ๋”๋ผ๋„ ์ˆœ์œ„์— ๊ณต๋ฐฑ์ด ์ƒ๊ธฐ์ง€ ์•Š๊ณ  ์—ฐ์†์ ์œผ๋กœ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

 

๋‹จ, auto commit์€ false๋กœ ์„ค์ • ๋˜์–ด ์žˆ๋‹ค๋Š” ๋ง์€ sql server๋ผ๋Š” ๋ง..

oracle์€ ์ˆ˜์ •ํ›„์— createํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ €์žฅ๋œ๋‹ค

    

ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ๋ฌธ์ œ...

ROWNUM ์„ ์ •๋ ฌ ์ „์— ์“ฐ๋ฉด ์•„๋ฌด ์˜๋ฏธ ์—†๋‹ค....

์ •๋‹ต์€ 3๋ฒˆ

 

' \d+', 'xxx', 1, 2 => ๋ฌธ์ž๋ฅผ xxx๋กœ ๋ฐ”๊พธ๋Š”๋ฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2๋ฒˆ์งธ ์œ„์น˜๊บผ๋ฅผ REPLACE ๋ฐ”๊ฟ”๋ผ

 

 

*** ๋…ธ๋žญ์ด ๋ชจ๋ฅด๋Š”๊ฑฐ

 

TCL :  ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋ฌถ์–ด DML์— ์˜ํ•ด ์กฐ์ž‘๋œ ๊ฒฐ๊ณผ๋ฅผ ์ž‘์—… ๋‹จ์œ„(Transaction) ๋ณ„๋กœ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์–ด์ธ Commit, Rollback, Savepoint ๋“ฑ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•˜๋ฉฐ, ์ผ๋ถ€์—์„œ๋Š” DCL๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ๋„ ํ•œ๋‹ค

 

UNIQUE๋Š” NULL ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!!! PK๋Š” ๋ถˆ๊ฐ€๋Šฅํ•จ ใ…‹ใ…‹ใ…‹

 

 

****  ๋…ธ๋žญ์ด ์ •๋ฆฌ

 

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

1. ๊ฐœ๋…์  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง : ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋†’๊ณ  ์—…๋ฌด์ค‘์‹ฌ์ ์ด๊ณ  ํฌ๊ด„์ ์ธ ์ˆ˜์ค€์˜ ๋ชจ๋ธ๋ง ์ง„ํ–‰, ์ „์‚ฌ์  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง, EA ์ˆ˜๋ฆฝ์‹œ ๋งŽ์ด ์ด์šฉ

2. ๋…ผ๋ฆฌ์  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง : ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•˜๋Š” ์—…๋ฌด์— ๋Œ€ํ•ด Key ์†์„ฑ, ๊ด€๊ณ„ ๋“ฑ์„ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„, ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์Œ

3. ๋ฌผ๋ฆฌ์  ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง : ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ด์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ฑ๋Šฅ, ์ €์žฅ ๋“ฑ ๋ฌผ๋ฆฌ์ ์ธ ์„ฑ๊ฒฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค๊ณ„ 

 

 

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์„ ํ•˜๋Š” ์ฃผ์š”ํ•œ ์ด์œ 

1. ์—…๋ฌด์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ •๋ณด๋“ค์— ๋Œ€ํ•ด ์ผ์ •ํ•œ ํ‘œ๊ธฐ๋ฒ•์— ์˜ํ•ด ํ‘œํ˜„ํ•จ์œผ๋กœ์จ ์ •๋ณด์‹œ์Šคํ…œ ๊ตฌ์ถ•์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ์—…๋ฌด ๋‚ด์šฉ์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ

2. ๋ถ„์„๋œ ๋ชจ๋ธ์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐœ๋ฐœ ๋ฐ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ

 

=> ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ด๋ผ๋Š” ๊ฒƒ์€ ๋‹จ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์“ฐ์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง ์ž์ฒด๋กœ์„œ ์—…๋ฌด๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋„ ๋งค์šฐ ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง

 

๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์œ ์˜์  : ์ค‘๋ณต, ๋น„์œ ์—ฐ์„ฑ, ๋น„์ผ๊ด€์„ฑ

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ 3๋‹จ๊ณ„

- ์™ธ๋ถ€ ์Šคํ‚ค๋งˆ : ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ถ€๋ถ„์  ๋ทฐ๋ฅผ ์ •์˜

- ๊ฐœ๋… ์Šคํ‚ค๋งˆ : ํ†ตํ•ฉ ๊ด€์ ์˜ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์€ ํ†ตํ•ฉ๊ด€์ ์˜ ๋ทฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐœ๋… ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๊ณผ์ •์ž„.

- ๋‚ด๋ถ€ ์Šคํ‚ค๋งˆ : ๋ฐ์ดํ„ฐ์˜ ๋ฌผ๋ฆฌ์  ์ €์žฅ ๊ตฌ์กฐ๋ฅผ ์ •์˜

 

ERD ์ž‘์„ฑ ์ˆœ์„œ

1. ์—”ํ„ฐํ‹ฐ๋ฅผ ๊ทธ๋ฆฐ๋‹ค

2. ์—”ํ„ฐํ‹ฐ๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•œ๋‹ค

3. ์—”ํ„ฐํ‹ฐ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•œ๋‹ค

4. ๊ด€๊ณ„๋ช…์„ ๊ธฐ์ˆ ํ•œ๋‹ค

5, ๊ด€๊ณ„์˜ ์ฐธ์—ฌ๋„๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค

6. ๊ด€๊ณ„์˜ ํ•„์ˆ˜์—ฌ๋ถ€๋ฅผ ๊ธฐ์ˆ ํ•œ๋‹ค

 

์—”ํ„ฐํ‹ฐ์˜ ํŠน์ง•

1.๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์—…๋ฌด์—์„œ ํ•„์š”ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ •๋ณด์—ฌ์•ผ ํ•œ๋‹ค

2. ์œ ์ผํ•œ ์‹๋ณ„์ž์— ์˜ํ•ด ์‹๋ณ„์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค

3. ์˜์†์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” (๋‘๊ฐœ ์ด์ƒ์˜)์ธ์Šคํ„ด์Šค์˜ ์ง‘ํ•ฉ์ด์–ด์•ผ ํ•œ๋‹ค

4. ์—”ํ„ฐํ‹ฐ๋Š” ์—…๋ฌด ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ด์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค

5. ์—”ํ„ฐํ‹ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค

6. ์—”ํ„ฐํ‹ฐ๋Š” ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€ ์ตœ์†Œ ํ•œ ๊ฐœ ์ด์ƒ์˜ ๊ด€๊ณ„์•ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค 

 

๊ธฐ๋ณธ์—”ํ„ฐํ‹ฐ(ํ‚ค์—”ํ„ฐํ‹ฐ) 

- ์›๋ž˜ ์กด์žฌํ•˜๋Š” ์ •๋ณด๋กœ์„œ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„์— ์˜ํ•ด ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ž์‹ ์€ ํƒ€ ์—”ํ„ฐํ‹ฐ์˜ ๋ถ€๋ชจ์˜ ์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค

- ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ๋กœ๋ถ€ํ„ฐ ์ฃผ์‹๋ณ„์ž๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š๊ณ  ์ž์‹ ์˜ ๊ณ ์œ ํ•œ ์ฃผ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค

- ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์›, ๋ถ€์„œ, ๊ณ ๊ฐ...

-  vs) ์ค‘์‹ฌ์—”ํ„ฐํ‹ฐ(๋ฉ”์ธ์—”ํ„ฐํ‹ฐ) : ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์—์„œ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์—”ํ„ฐํ‹ฐ์™€ ๊ด€๊ณ„๋ฅผ ๋งบ๋Š” ์ค‘์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•˜๋Š” ์—”ํ„ฐํ‹ฐ๋กœ ์—ฌ๋Ÿฌ ์—”ํ„ฐํ‹ฐ์™€์˜ ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค

 

์†์„ฑ(Attribute) 

: ์—…๋ฌด์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์ธ์Šคํ„ด์Šค์—์„œ ๊ด€๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์˜๋ฏธ์ƒ ๋” ์ด์ƒ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š๋Š” ์ตœ์†Œ์˜ ๋ฐ์ดํ„ฐ ๋‹จ์œ„

=> ์—…๋ฌด์ƒ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ์˜ ์˜๋ฏธ ๋‹จ์œ„(์—”ํ„ฐํ‹ฐ์˜ ํ•œ ๋ถ„์•ผ)

 

์†์„ฑ์˜ ํŠน์„ฑ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

- ๊ธฐ๋ณธ์†์„ฑ :  ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์†์„ฑ('๊ณ ๊ฐ' ์—”ํ„ฐํ‹ฐ์˜  '์ด๋ฆ„', '์ฃผ์†Œ', '์ „ํ™”๋ฒˆํ˜ธ')

- ์„ค๊ณ„ ์†์„ฑ : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€๋œ ์†์„ฑ('์ฃผ๋ฌธ' ์—”ํ„ฐํ‹ฐ์˜ '์ฃผ๋ฌธ๋ฒˆํ˜ธ', '๊ณ ๊ฐID')

- ํŒŒ์ƒ ์†์„ฑ : ๋‹ค๋ฅธ ์†์„ฑ ๊ฐ’์—์„œ ๊ณ„์‚ฐ๋˜๊ฑฐ๋‚˜ ์œ ๋„๋˜๋Š” ์†์„ฑ, ์กฐํšŒํ•  ๋•Œ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋‚ด๋„๋ก ํ•จ('์ฃผ๋ฌธ' ์—”ํ„ฐํ‹ฐ์˜ ์ด๊ธˆ์•ก)

 

 ์†์„ฑ์˜ ๋„๋ฉ”์ธ

:  ๊ฐ ์†์„ฑ์€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์˜ ๋ฒ”์œ„๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์†์„ฑ์˜ ๋„๋ฉ”์ธ์ด๋ผํ•˜๋ฉฐ, ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ ์†์„ฑ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐํƒ€์ž…๊ณผ ํฌ๊ธฐ ๊ทธ๋ฆฌ๊ณ  ์ œ์•ฝ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ

 

๋‘๊ฐœ์˜ ์—”ํ„ฐํ‹ฐ ์‚ฌ์ด์— ์ฒดํฌํ•ด์•ผ ํ•  ์‚ฌํ•ญ

1. ๋‘ ๊ฐœ์˜  ์—”ํ„ฐํ‹ฐ ์‚ฌ์ด์— ๊ด€์‹ฌ์žˆ๋Š” ์—ฐ๊ด€๊ทœ์น™์ด ์กด์žฌํ•˜๋Š”๊ฐ€?

2. ๋‘ ๊ฐœ์œ ์—”ํ„ฐํ‹ฐ ์‚ฌ์ด์— ์ •๋ณด์˜ ์กฐํ•ฉ์ด ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?

3. ์—…๋ฌด๊ธฐ์ˆ ์„œ, ์žฅํ‘œ์— ๊ด€๊ณ„์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ๊ทœ์น™์ด ์„œ์ˆ ๋˜์–ด ์žˆ๋Š”๊ฐ€?

4. ์—…๋ฌด๊ธฐ์ˆ ์„œ, ์žฅํ‘œ์— ๊ด€๊ณ„์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋™์‚ฌ๊ฐ€ ์žˆ๋Š”๊ฐ€?

 

์ฃผ์‹๋ณ„์ž๋ฅผ ์ €์žฅํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ

- ์ฃผ์‹๋ณ„์ž์— ์˜ํ•ด ์—”ํ„ฐํ‹ฐ๋‚ด์— ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋“ค์ด ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•œ๋‹ค(์œ ์ผ์„ฑ)

- ์ฃผ์‹๋ณ„์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์†์„ฑ์˜ ์ˆ˜๋Š” ์œ ์ผ์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ์†Œ์˜ ์ˆ˜๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค(์ตœ์†Œ์„ฑ)

- ์ง€์ •๋œ ์ฃผ์‹๋ณ„์ž์˜ ๊ฐ’์€ ์ž์ฃผ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค(๋ถˆ๋ณ€์„ฑ)

- ์ฃผ์‹๋ณ„์ž๊ฐ€ ์ง€์ •์ด ๋˜๋ฉด ๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ๋“ค์–ด์™€์•ผ ํ•œ๋‹ค(์กด์žฌ์„ฑ)                                                                                                                                                                                                                                                                              

์‹๋ณ„์ž์˜ ์ข…๋ฅ˜

- ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ ๋Œ€ํ‘œ์„ฑ์„ ๊ฐ€์ง€๋Š”๊ฐ€์— ๋”ฐ๋ผ ์ฃผ์‹๋ณ„์ž์™€ ๋ณด์กฐ์‹๋ณ„์ž๋กœ ๊ตฌ๋ถ„

- ์—”ํ„ฐํ‹ฐ ๋‚ด์—์„œ ์Šค์Šค๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‚ด๋ถ€์‹๋ณ„์ž์™€ ์™ธ๋ถ€์‹๋ณ„์ž๋กœ ๊ตฌ๋ถ„

- ๋‹จ์ผ ์†์„ฑ์œผ๋กœ ์‹๋ณ„์ด ๋˜๋Š”๊ฐ€์— ๋”ฐ๋ผ ๋‹จ์ผ์‹๋ณ„์ž์™€ ๋ณตํ•ฉ ์‹๋ณ„์ž๋กœ ๊ตฌ๋ถ„

- ์›๋ž˜ ์—…๋ฌด์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋˜ ์‹๋ณ„์ž ์†์„ฑ์„ ๋Œ€์ฒดํ•˜์—ฌ ์ผ๋ จ๋ฒˆํ˜ธ์™€ ๊ฐ™์ด ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“  ์‹๋ณ„์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ณธ์งˆ์‹๋ณ„์ž์™€ ์ธ์กฐ์‹๋ณ„์ž๋กœ ๊ตฌ๋ถ„

 

์„ฑ๋Šฅ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ์ˆ˜ํ–‰ ์ ˆ์ฐจ์— ๋Œ€ํ•œ ์„ค๋ช…..

1. ๋ฐ์ดํ„ฐ๋ชจ๋ธ๋ง์„ ํ•  ๋•Œ ์ •๊ทœํ™”๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰

2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์šฉ๋Ÿ‰์‚ฐ์ •์„ ์ˆ˜ํ–‰

3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐœ์ƒ๋˜๋Š” ํŠธ๋žœ์žญ์…˜์˜ ์œ ํ˜•์„ ํŒŒ์•…

4. ์šฉ๋Ÿ‰๊ณผ ํŠธ๋žœ์žญ์…˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋ฐ˜์ •๊ทœํ™”๋ฅผ ์ˆ˜ํ–‰

5. ์ด๋ ฅ๋ชจ๋ธ์˜ ์กฐ์ •, PK/FK ์กฐ์ •, ์Šˆํผ ํƒ€์ž…/์„œ๋ธŒํƒ€์ž… ์กฐ์ • ๋“ฑ์„ ์ˆ˜ํ–‰

6. ์„ฑ๋Šฅ๊ด€์ ์—์„œ ๋ฐ์ดํ„ฐ๋ชจ๋ธ์„ ๊ฒ€์ฆ                                                                                                                                         

 

 

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

์‹ค์Šต ๋ชฉํ‘œ ๋ฐ ๊ฐ„๋‹จํ•œ ๋™์ž‘ ์›๋ฆฌ

 

์‹ค์Šต ๋ชฉํ‘œ

: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ์ฆ, ์ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ํšŒ์› ์ •๋ณด ์ €์žฅ(์˜์†์„ฑ)์€ MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค

 

๊ตฌํ˜„

- ์ธ์ฆ : ๋กœ๊ทธ์ธ

- ์ธ๊ฐ€ : ๊ฒฝ๋กœ๋ณ„ ์ ‘๊ทผ ๊ถŒํ•œ

- ํšŒ์›๊ฐ€์ž…

 

์‹œํ๋ฆฌํ‹ฐ ๋™์ž‘ ์›๋ฆฌ

๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด ๋ณด์ž๋ฉด....

 

Spring Security Config๋ผ๋Š” filter๋ฅผ ๋งŒ๋“ค์–ด ๋†“์œผ๋ฉด client์˜ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ client๊ฐ€ ๊ฐ€๊ณ ์‹ถ์€ ๋ชฉ์ ์ง€ ์ด์ „์— ํŠน์ •ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๋ถ„์„์„ ํ•˜๊ณ  ๊ถŒํ•œ์„ ํ™•์ธ์„ ํ•˜์—ฌ ๋ง‰๋“ ์ง€ ํ—ˆ์šฉํ•˜๋“ ์ง€ ํ•ฉ๋‹ˆ๋‹ค(์„ธ์…˜์— ๋กœ๊ทธ์ธ ์ •๋ณด ๋ƒ„๊น€)

 

๋ฒ„์ „

- Spring Boot 3.1.5

- Security 6.1.5

- Spring Data JPA - MySQL

- mustache

- IntelliJ Ultimate

 

 

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

 

์˜์กด์„ฑ

- Spring Web

- Lombok

- Mustache

- Spring Security

- Spring Data JPA

- MySQL Driver

 

 

main page

 

package com.example.testsecurity.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {

    @GetMapping("/")
    public String mainP() {

        return "main";
    }
}

 

<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Main Page</title>
</head>
<body>
main page
</body>
</html>

 

์•„์ด๋”” : user / ๋น„๋ฐ€๋ฒˆํ˜ธ : ์ธํ…”๋ฆฌ์ œ์ด์—์„œ ์ค€๊ฑธ ๋“ค์–ด๊ฐ€๋ฉด ๋งŒ๋“  ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!!

 

 

Security Config ํด๋ž˜์Šค

 

 

์ธ๊ฐ€

 

ํŠน์ • ๊ฒฝ๋กœ์— ์š”์ฒญ์ด ์˜ค๋ฉด Controller ํด๋ž˜์Šค์— ๋„๋‹ฌํ•˜๊ธฐ ์ „ ํ•„ํ„ฐ์—์„œ Spring Security๊ฐ€ ๊ฒ€์ฆ์„ ํ•จ

 

1. ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์ ‘๊ทผ์€ ๋ˆ„๊ตฌ์—๊ฒŒ ์—ด๋ ค ์žˆ๋Š”์ง€

2, ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋œ ์‚ฌ์šฉ์ž์ธ์ง€

3. ํ•ด๋‹น๋˜๋Š” role์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€

 

 

์‹œํ๋ฆฌํ‹ฐ Config ํด๋ž˜์Šค ์ž‘์„ฑ

 

package com.example.testsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

        http
                .authorizeHttpRequests((auth) -> auth
                        .requestMatchers("/", "/login").permitAll() 		// permitAll() : ๋ชจ๋‘ ํ—ˆ์šฉ
                        .requestMatchers("/admin").hasRole("ADMIN")			// hasRole() : ํ•ด๋‹น ์—ญํ• ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ
                        .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER") // hasAnyRole() : ํ•ด๋‹น ์—ญํ• ๋“ค์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋“ค๋งŒ
                        .anyRequest().authenticated()	// anyRequest() : ์ด์™ธ์— ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ ๋กœ์ง๋“ค / authenticated : ๋กœ๊ทธ์ธํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž
                );

        return http.build();
    }
}

 

์ƒ๋‹จ ๋ถ€ํ„ฐ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ์— ์œ ์˜ํ•˜์—ฌ ์ ์–ด์•ผ ํ•œ๋‹ค(๋ฐ‘์— ์ฝ”๋“œ๋“ค์ด ์•ˆ ๋จน์„ ์ˆ˜ ์žˆ์Œ)

 

 

์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์ƒ์„ฑ

 

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class AdminController {

    @GetMapping("/admin")
    public String admin() {

        return "admin";
    }
}

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>admin Page</title>
</head>
<body>
admin Page
</body>
</html>

 

admin ํŽ˜์ด์ง€์— ๋”ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ... ๋”ฐ๋กœ role์„ ์„ค์ •ํ•ด ์ฃผ์ง€ ์•Š์•„์†Œ... 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
  1. ec2 ๋ฐœ๊ธ‰
  2. ufw ์„ค์ • ๋ฐ port ๊ตฌ์„ฑ๋„
  3. swap ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
  4. docker ์„ค์น˜ (+ Ubuntu ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ…)
  5. docker-compose & jenkins ์„ค์น˜
  6. jenkins gitlab ์—ฐ๋™(project-build) ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  7. Nginx
  8. https ์ ์šฉ
  9. Jenkins Pipeline ์ž‘์„ฑ
  10. S3 ์„ค์น˜ ๋ฐ ์„ค์ •
  11. RDS ์„ค์น˜ ๋ฐ ์„ค์ •

 

https ์ ์šฉ

 

Certbot ????

: Let's encrypt๋ฅผ ์ด์šฉํ•ด์„œ ssl ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰, ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค ํˆด
- Certbot์„ ๋”ฐ๋กœ ์„ค์น˜ํ•ด๋„ ๋˜๊ณ , letsencrypt๋ฅผ ์„ค์น˜ํ•ด๋„ ๋จ(certbot์ด ํฌํ•จ๋˜์–ด์žˆ์Œ)

 

 

์ธ์ฆ์„œ ๋ฐœ๊ธ‰(Let's Ecrypt)

 

- Let's Ecrypt๋Š” ์ด๋ฉ”์ผ๊ณผ ๋„๋ฉ”์ธ๋งŒ์œผ๋กœ, ๋น ๋ฅด๊ฒŒ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด๋ฃŒ ์„œ๋น„์Šค

- Certbot์„ ํ†ตํ•ด์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

 

 

certbot ์„ค์น˜

sudo snap install certbot-nginx
sudo apt-get update
sudo apt-get install python3-certbot-nginx

 

SSL(Secure Sockets Layer) ????

: Netscape Communications Corporation ์—์„œ ์›น ์„œ๋ฒ„์™€ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ„์˜ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋งŒ๋“  ํ”„๋กœํ† ์ฝœ
๊ณต๊ฐœํ‚ค / ๊ฐœ์ธํ‚ค ๋Œ€์นญํ‚ค ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉํ•จ

๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ 
=> Let's Encrypt / AWS Certificate Manager

 

 

Nginx์— SSL ์ ์šฉํ•˜๊ธฐ

sudo certbot --nginx -d {๋„๋ฉ”์ธ}

ex)
sudo certbot --nginx -d sokdaksokdak.com

 

- ์œ„์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋ฉด์„œ nginx์— ์ธ์ฆ์„œ ๊ด€๋ จ ์„ค์ •์„ ์ž๋™์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค

- ์ž‘์„ฑํ•˜๋ฉด Successfullu received certificate๋ผ๋Š” ์•ˆ์• ์™€ ํ•จ๊ป˜ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ

 

/etc/nginx/sites-availble ๊ฒฝ๋กœ๋กœ ๊ฐ€๋ฉด default๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋Š”๋ฐ ์ด ๊ณต๊ฐ„์— default ํŒŒ์ผ์€ ์‚ญ์ œํ•˜๊ณ  project.conf๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ด๋ฆ„์€ ์ƒ๊ด€ ์—†์ง€๋งŒ ์œ„์น˜๋Š” ์ € ์œ„์น˜์—ฌ์•ผ ํ•จ)

 

server {
    listen 80;
    server_name k10d101.p.ssafy.io;

    # HTTP ์š”์ฒญ์„ HTTPS๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    listen 443 ssl; // 443 ํฌํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์Œ
    server_name k10d101.p.ssafy.io; // ๋„๋ฉ”์ธใ€€์ง€์ •

    include /etc/nginx/conf.d/service_url.inc;

    ssl_certificate /etc/letsencrypt/live/k10d101.p.ssafy.io/fullchain.pem; # SSL ์ธ์ฆ์„œ
    ssl_certificate_key /etc/letsencrypt/live/k10d101.p.ssafy.io/privkey.pem; # SSL ํ‚ค
    include /etc/letsencrypt/options-ssl-nginx.conf; # SSL ์˜ต์…˜
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # DH ํŒŒ๋ผ๋ฏธํ„ฐ
    
     # Frontend: ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋ฐ SPA ๋ผ์šฐํŒ… ์ง€์›
    location / {
        proxy_pass http://localhost:3000; # Docker ์„œ๋น„์Šค ์ด๋ฆ„ ์‚ฌ์šฉ
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
     # Backend: API ์š”์ฒญ
    location /api/ {
        proxy_pass $service_url; # Docker ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ํฌํŠธ ์‚ฌ์šฉ
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Connection "close"; # API ์š”์ฒญ์—๋Š” 'Connection: upgrade' ๋ถˆํ•„์š”
    }
}

 

$ sudo service nginx restart

 

๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด nginx๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด...

 

 

 

์ฐธ๊ณ 

 

https://www.youtube.com/watch?v=wPdH7lJ8jf0&t=508s&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC

 

https://velog.io/@byeongju/HTTPS-%EC%A0%81%EC%9A%A9%EA%B8%B0

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
  1. ec2 ๋ฐœ๊ธ‰
  2. ufw ์„ค์ • ๋ฐ port ๊ตฌ์„ฑ๋„
  3. swap ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
  4. docker ์„ค์น˜ (+ Ubuntu ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ…)
  5. docker-compose & jenkins ์„ค์น˜
  6. jenkins gitlab ์—ฐ๋™(project-build) ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  7. Nginx
  8. https ์ ์šฉ
  9. Jenkins Pipeline ์ž‘์„ฑ
  10. S3 ์„ค์น˜ ๋ฐ ์„ค์ •
  11. RDS ์„ค์น˜ ๋ฐ ์„ค์ •

 

jenkins gitlab ์—ฐ๋™(project-build) ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜

 

Backend Dockerfile(๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ)

FROM openjdk:17-jdk-alpine
VOLUME /tmp 
ADD ./build/libs/backend-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS=""
ENTRYPOINT ["java", "-jar", "/app.jar"]

 

  1. FROM openjdk:17-jdk-alpine
    : openjdk:17-jdk-alpine ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ
    - openjdk:17-jdk-alpine ๋Š” OpenJDK 17์„ ํฌํ•จ + ๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ ์ค‘ ํ•˜๋‚˜์ธ Alpine Linux ๊ธฐ๋ฐ˜์˜ ์ด๋ฏธ์ง€
    - Alpine Linux๋Š” ๊ฒฝ๋Ÿ‰ํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค
  2. VOLUME /tmp
    : /tmp ๊ฒฝ๋กœ์— ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ ํ•จ
    - ์ผ๋ฐ˜์ ์œผ๋กœ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” /tmp๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์‹œ ํŒŒ์ผ ๋“ฑ์„ ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  3. ADD ./build/libs/backend-0.0.1-SNAPSHOT.jar app.jar
    : ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ์˜ backend-0.0.1-SNAPSHOT.jar ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— app.jar๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณต์‚ฌ
    -  ADD๋Š” COPY์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์›๊ฒฉ URL์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์••์ถ• ํ•ด์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณต
  4. ENV JAVA_OPTS=""
    : ํ™˜๊ฒฝ ๋ณ€์ˆ˜  JAVA_OPTS๋ฅผ ์„ค์ •

    - ๊ธฐ๋ณธ์ ์œผ๋กœ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •๋˜์–ด ์žˆ์Œ
  5. ENTRYPOINT ["java", "-jar", "/app.jar"]
    : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ง€์ •
    - java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด
    - -jar ์˜ต์…˜ ๋‹ค์Œ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ JAR ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์ธ /app.jar๋ฅผ ์ง€์ •ํ•จ

 

 

Frontend Dockerfile

FROM node:20.12.0

WORKDIR /app

COPY package.json /app

RUN npm install
COPY . /app

EXPOSE 3000
RUN npm run docs-build

CMD ["npm","run", "docs"]

 

 

  1. 'FROM node:20.12.0'.
    : 'node:20.12.0' ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ Docker ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ
  2. WORKDIR /app
    : 'WORKDIR' ๋ช…๋ น์–ด๋Š” Docker ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ '/app' ์œผ๋กœ ์„ค์ •
     ์ดํ›„์˜ ๋ช…๋ น์–ด๋“ค์€ ์ด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰
  3. COPY package.json /app
    : ํ˜ธ์ŠคํŠธ ๊ธฐ๊ธฐ์˜ 'package.json' ํŒŒ์ผ์„ ์ด๋ฏธ์ง€ ๋‚ด์˜ '/app' ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌ
  4. RUN npm install
    : npm install ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ package.json์— ์ •์˜๋œ Node.js ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ์„ ์„ค์น˜
  5. COPY . /app
    : ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด๋ฏธ์ง€ ๋‚ด์˜ '/app' ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
  6. EXPOSE 3000
    : ์นธํ…Œ์ธ์ €๊ฐ€ ๋ฆฌ์Šค๋‹ํ•  ํฌํŠธ ๋ฒˆํ˜ธ 3000์„ Docker์— ์•Œ๋ฆผ. ์ด ํฌํŠธ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค
  7. RUN npm run docs-build
    : npm run docs-build ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰
  8. CMD ["npm","run", "docs"]
    : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋–„ 'npm run docs' ๋ช…๋ น์„ ์‹คํ–‰(์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์„œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)

 

Ngnix

Ngnix ????

: ๊ฒฝ๋Ÿ‰ ์›น์„œ๋ฒ„๋กœ ์ •์ ํŒŒ์ผ์„ serving ํ•˜๋Š” web server ๋˜๋Š” ์š”์ฒญ์„ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๋Š” reverse proxy server๋กœ ํ™œ์šฉ๋˜์–ด was์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ด๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค


=> ์›น  ์„œ๋ฒ„์ค‘ apache์™€์˜ ํŒŒ์ด์  : ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
apache ์›น ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์š”์ฒญ์ด ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ์ž์›์ด ๋งŽ์ด ์†Œ๋ชจ๋œ๋‹ค
๋ฐ˜๋ฉด์— nginx๋Š” event-driven ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•˜๋Š”๋ฐ, ์ด ๋•Œ๋ฌธ์— ํ•˜๋‚˜ ๋˜๋Š” ๊ณ ์ •๋œ ๊ฐœ์ˆ˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์ƒ์„ฑ๋˜๊ณ  ์š”์ฒญ๋“ค์€ ๋™์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๋‹ค ์ ์€ ์ž์›์œผ๋กœ๋„ ํšจ์œจ์ ์ธ ์šด์šฉ์ด ๊ฐ€๋Šฅ

 

 

sudo apt update 
sudo apt-get install nginx

 

- sudo apy update : ์‹œ์Šคํ…œ์˜ ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ

- sudo apt-get install nginx :  nginx ์›น ์„œ๋ฒ„๋ฅผ ์„ค์น˜

 

 

nginx ์›น ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

sudo nano /etc/nginx/sites-available/๋‚ด๊ฐ€ ๋งŒ๋“ค ๊ฒƒ
vi์ฝ”๋“œ๋กœ ์—ด๊ณ  ๋ฐ‘์— ๋ช…๋ น์–ด๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

server {
    listen 80;					// ์„œ๋ฒ„๊ฐ€ 80๋ฒˆ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๋„๋ก ์„ค์ •
    server_name abc.com www.abc.com;		// ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•จ

    root /var/www/abc.com/html;				// ์›น ๋ฌธ์„œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ €์žฅ(์‹ค์ œ ์›น ํŒŒ์ผ๋“ค์ด ์—ฌ๊ธฐ ์œ„์น˜/ abc.com์€ ๋‚ด ๋„๋ฉ”์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•จ)
    index index.html index.htm index.nginx-debian.html;	// ๊ธฐ๋ณธ ์ธ๋ฑ์Šค ํŒŒ์ผ๋“ค์„ ์ •์˜ nginx๋Š” ์š”์ฒญ๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ด ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ์‘๋‹ต์œผ๋กœ ๋ณด๋ƒ„

    location / {						// ๋ฃจํŠธ url('/') ์— ๋Œ€ํ•œ ์„ค์ •์„ ์ •์˜
        try_files $uri $uri/ =404;		// ์š”์ฒญ๋œ ํŒŒ์ผ์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ์„œ๋น™, ์—†์œผ๋ฉด ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ™•์ธ, ๋‘˜๋‹ค ์—†์œผ๋ฉด 404 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜
    }
}

 

 

ํ•ด๋‹น ํŒŒ์ผ์„ sites-enabled๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.


: sites-available ๋””๋ ‰ํ† ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ์ดํŠธ์˜ ์„ค์ • ํŒŒ์ผ์„ ๋ณด๊ด€ํ•˜๋Š” ๊ณณ / sites-enabled๋Š” ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ์‚ฌ์ดํŠธ์˜ ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ๋ณด๊ด€ํ•จ์œผ๋กœ์จ, ํŠน์ • ์‚ฌ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

nginx ์žฌ์‹คํ–‰

 

sudo nginx -t 	 			// nginx์˜ ์„ค์ • ํŒŒ์ผ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธ
sudo systemctl restart nginx		// nginx ์žฌ์‹œ์ž‘
sudo service nginx status		// nginx๊ฐ€ ์ž˜ ์‹คํ–‰์ค‘์ธ์ง€ ํ™•์ธ

 

 

๊ทธ ํ›„์— ec2 ํผ๋ธ”๋ฆญ ip์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๋ฉด 

๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

์ฐธ๊ณ 

https://blog.naver.com/gi_balja/223028077537

 

Nginx๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Nginx(์—”์ง„์—‘์Šค)๋Š” ๋†’์€ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” ์›น ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Apache(์•„...

blog.naver.com

 

https://velog.io/@dev_leewoooo/Forward-Proxy-Reverse-Proxy%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•
  1. ec2 ๋ฐœ๊ธ‰
  2. ufw ์„ค์ • ๋ฐ port ๊ตฌ์„ฑ๋„
  3. swap ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
  4. docker ์„ค์น˜ (+ Ubuntu ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ…)
  5. docker-compose & jenkins ์„ค์น˜
  6. jenkins gitlab ์—ฐ๋™(project-build) ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  7. dockerHub ์„ค์น˜ ๋ฐ ์—ฐ๋™(docker-build)
  8. dockerScript ์ž‘์„ฑ(pipeline)
  9. Nginx
  10. S3 ์„ค์น˜ ๋ฐ ์„ค์ •
  11. RDS ์„ค์น˜ ๋ฐ ์„ค์ •

 

docker ์„ค์น˜

 

Docker ?????

- ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ์ปจํ…Œ์ด๋„ˆํ™” ๊ธฐ์ˆ ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ
- ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ€์ƒ ๋จธ์‹ (VM ware, VirtualBox) ๋ณด๋‹ค ๊ฐ€๋ฒผ์›Œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ด ์ ๊ณ , ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ์†์‹ค์ด ๊ฑฐ์˜  ์—†๋‹ค
- ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹คํ–‰ ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜๋ฏ€๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ , ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ€์ƒ ๋จธ์‹ ์— ๋น„ํ•ด ๋น ๋ฅด๊ณ , ๋„์ปค ์—”์ง„์„ ํ†ตํ•ด ์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค
- ๋„์ปค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„ ๊ตฌ์„ฑ
 [ ์ €์žฅ์†Œ ์ด๋ฆ„ ] / [ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ] : [ ํƒœ๊ทธ ]

์ €์žฅ์†Œ ์ด๋ฆ„ : ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋œ ์žฅ์†Œ, ์ €์žฅ์†Œ ์ด๋ฆ„์ด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋Š” ๋„์ปค ํ—ˆ๋ธŒ์˜ ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ๋œปํ•จ
์ด๋ฏธ์ง€ ์ด๋ฆ„ : ํ•ด๋‹น ์ด๋ฏธ์ง€๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋ฉฐ ํ•„์ˆ˜๋กœ ์„ค์ •
Ex) ubuntu:latest : ์šฐ๋ถ„ํˆฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ด๋ฏธ์ง€
ํƒœ๊ทธ : ์ด๋ฏธ์ง€์˜ ๋ฒ„์ „์„ ๋‚˜ํƒ€๋ƒ„, ํƒœ๊ทธ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ๋„์ปค ์—”์ง„์€ latest๋กœ ์ธ์‹ํ•จ

 

 

Ubuntu ๊ธฐ๋ณธ ํ™˜๊ฒฝ ์„ธํŒ…

 

sudo apt update
sudo apt upgrade

 

  • sudo apt update : ์‹œ์Šคํ…œ์ด ์ƒˆ๋กœ์šด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ๋•Œ ๊ฐ€์žฅ ์ตœ์‹  ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ
  • sudo apt upgrade : ์‹œ์Šคํ…œ์— ์„ค์น˜๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•จ 
sudo apt install apt-transport-https ca-certificates

 

  • apt-transport-https 
    : HTTPS ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ฒŒ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํŒจํ‚ค์ง€
    : HTTPS๋Š” ๋ฐ์ดํ„ฐ ์ „์†ก ์ค‘์— ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•จ
  • ca-certificates 
    : ์ธ์ฆ์„œ(authority certificates)๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ
    : HTTPS ํ†ต์‹  ์‹œ์— ์„œ๋ฒ„์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•จ
sudo apt install curl gnupg-agent software-properties-common
  • curl
    : ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ๋ช…๋ น์ค„ ๋„๊ตฌ
    : ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋ฉฐ ์ฃผ๋กœ ์›น์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ api ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ
  • gnupg-agent
    : GNU Privacy Guard(GnuPG)์˜ ์—์ด์ „ํŠธ ํ”„๋กœ๊ทธ๋žจ
    : ์•”ํ˜ธํ™” ๋ฐ ์„œ๋ช… ์ž‘์—…์— ํ•„์š”ํ•œ ํ‚ค ๊ด€๋ฆฌ๋ฅผ ์ง€์›( ์บ์‹ฑํ•˜์—ฌ ์•”ํ˜ธ ํ†ต์‹ ์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)
  • software-properties-common
    : ์†Œํ”„ํŠธ์›จ์–ด ์†Œ์Šค ๋ฐ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๊ณตํ†ต ์†Œํ”„ํŠธ์›จ์–ด ์†์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํŒจํ‚ค์ง€
    : add-apt-repository ์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

 

GPG ํผ๋ธ”๋ฆญ ํ‚ค ์—๋Ÿฌ

 

GPG(GNU Privacy Guard) ????

- ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋กœ, PGP(Pretty Good Privacy)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ๋ณด์•ˆํ†ต์‹ ์„ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค
- ๊ณต๊ฐœ ํ‚ค(Public Key) : ์ด ํ‚ค๋Š” ๋‹ค๋ฅธ ์‚ฌ๋ฆ„๋“ค์—๊ฒŒ ๊ณต์œ ๋˜๋ฉฐ, ์ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์˜ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค
- .๋น„๊ณต๊ฐœ ํ‚ค(Private Key) : ์ด ํ‚ค๋Š” ์‚ฌ์šฉ์ž๋งŒ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๋…ํ•˜๊ฑฐ๋‚˜ ์ž์‹ ์˜ ๋””์ง€ํ„ธ ์„œ๋ช…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
- GPG ํ‚ค๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…, ์—„ํ˜ธํ™”, ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€์˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ ๋“ฑ์— ์‚ฌ์šฉ๋œ๋‹ค
Ex) ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฐœ๋ฐœ์ž๋Š” GPG ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€์— ์„œ๋ช…ํ•˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ๊ทธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œํ•œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์›๋ณธ ๊ทธ๋Œ€๋กœ์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

W: GPG error: https://download.docker.com/linux/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
E: The repository 'https://download.docker.com/linux/ubuntu focal InRelease' is not signed.

 

ํ•ด๋‹น ์—๋Ÿฌ : Docker ์ €์žฅ์†Œ์˜ GPG ํ‚ค๊ฐ€ ์‹œ์Šคํ…œ์— ์ œ๋Œ€๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜๋‹ค...๋ผ๋Š” ์˜๋ฏธ

 

 

๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡

์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

 

  1. GPG ํ‚ค ์ถ”๊ฐ€
    : ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—๋Š” ๋ˆ„๋ฝ๋œ ๊ณต๊ฐœ ํ‚ค(NO_PUBKEY 7EA0A9C3F273FCD8) ๊ฐ€  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. 
     ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค ๋ชฉ๋ก์— ์ด ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค!!
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • curl -fsSL https://download.docker.com/linux/ubuntu/gpg : Docker์˜ GPG ํ‚ค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค...
    ์—ฌ๊ธฐ์„œ -f ๋Š” ์‹คํŒจ ์‹œ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , -s ๋Š” ์นจ๋ฌต ๋ชจ๋“œ(์ถœ๋ ฅ ์—†์Œ)๋กœ ์‹คํ–‰ํ•˜๋ฉฐ, -S ๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅ, -L ๋Š” ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋”ฐ๋ฆ„
  • | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg : ๋‹ค์šด๋กœ๋“œํ•œ GPG ํ‚ค๋ฅผ dearmor ํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  /usr/share/keyrings/docker-archive-keyring.gpg์— ์ €์žฅ

 

2. Docker ์ €์žฅ์†Œ ์ถ”๊ฐ€
  :  ์ด์ „์— ํ‚ค๊ฐ€ ์ œ๋Œ€๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ง€์ •๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Docker ์ €์žฅ์†Œ๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

3. ์‹œ์Šคํ…œ ์—…๋ฐ์ดํŠธ
 : ํ‚ค์™€ ์ €์žฅ์†Œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ถ”๊ฐ€ํ•œ ํ›„ ํŒจํ‚ค์ง€ ์ƒ‰์ธ์„ ์—…๋ฐ์ดํŠธ 

sudo apt-get update

 

4. Docker ์„ค์น˜ 

sudo apt-get install docker-ce docker-ce-cli containerd.io
docker -v

 

 

๋„์ปค์˜ ๊ธฐ๋ณธ ๋ช…๋ น์–ด๋“ค

 

$ docker run  // ์ƒˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰
$ docker ps   // ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์คŒ, -a ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ๊นŒ์ง€
$ doxker stop // ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์ง€
$ docker rm   // ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
$ docker images // ์‹œ์Šคํ…œ์— ์žˆ๋Š” ๋„์ปค ์ด๋ฏธ์ง€์˜ ๋ชฉ๋ก์„ ๋ณด์—ฌ์คŒ
$ docker pull 	// ๋ฆฌ๋ชจํŠธ ์ €์žฅ์†Œ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ธฐ
$ docker build  // doxkerfile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œ

 

 

docker-compose & jenkins ์„ค์น˜

 

Docker Compose ????

- ์—ฌ๋Ÿฌ ๊ฐœ์˜ Docker ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋กœ ์ •์˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ด ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ๊ด€๋ผํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ

 

 

๋„์ปค ์ปดํฌ์ฆˆ ์„ค์น˜

# ๋„์ปค ์ปดํฌ์ฆˆ V2 ๋ฒ„์ „ ์„ค์น˜
sudo curl -sSL "https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 
# ์‹คํ–‰ ๊ถŒํ•œ ์„ค์ •
chmod +x /usr/local/bin/docker-compose
 
# ๋ฒ„์ „ ํ™•์ธ
docker-compose --version

 

 

docker-compose.yml ์ž‘์„ฑ

version: '3.7'

services:
  jenkins:
    image: 'jenkins/jenkins'
    restart: unless-stopped
    user: root
    privileged: true
    ports:
      - '9090:8080'
    volumes:
      - '/home/ubuntu/docker/jenkins-data:/var/jenkins_home'
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/usr/bin/docker:/usr/bin/docker'
    container_name: 'jenkins'

 

 

ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋น„๋ฒˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

 

์ฐธ๊ณ 

 

https://seosh817.tistory.com/345

 

[Docker] ๋„์ปค๋ž€? - ๋„์ปค ๊ฐœ๋… ์ •๋ฆฌ

๋„์ปค๋ž€? ๋„์ปค(Docker)๋Š” ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ์— ๋ฆฌ๋ˆ…์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ์ž…๋‹ˆ๋‹ค. ๋„์ปค๋Š” ์ผ๋ฐ˜์ 

seosh817.tistory.com

 

https://uyfuyfuy-042.tistory.com/entry/GPG-keyPGP

 

GPG key(PGP)

GPG(GNU Privacy Guard) ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค. PGP(Pretty Good Privacy)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ๋ณด์•ˆํ†ต์‹ ์„ ์œ„ํ•œ ์˜คํ”„์†Œ์Šค์ด๋‹ค. ๊ณต๊ฐœ ํ‚ค(Public Key): ์ด ํ‚ค๋Š”

uyfuyfuy-042.tistory.com

 

https://hstory0208.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%B4%9D%EB%AA%A8%EC%9D%8C%EC%A7%91-image-container-compose

 

[Docker] ๋„์ปค ๋ช…๋ น์–ด ์ด๋ชจ์Œ์ง‘ (image, container, compose)

๐Ÿ“Œ Docker ์‹คํ–‰ sudo systemctl status docker # 1 sudo /etc/init.d/docker start # 2 Docker Image ๊ด€๋ จ ๋ช…๋ น์–ด ์ด๋ฏธ์ง€ ๋นŒ๋“œ Dockerfile์„ ์ด์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ์ƒ์„ฑ (์ œ์ผ ๋งŽ์ด ์“ฐ๋Š” ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐฉ๋ฒ•) โžก docker build -t {์ด๋ฏธ์ง€

hstory0208.tistory.com

 

https://hstory0208.tistory.com/entry/Docker-%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88Docker-Compose%EB%9E%80-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80

 

[Docker] ๋„์ปค ์ปดํฌ์ฆˆ(Docker Compose)๋ž€? ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

๐Ÿ“Œ ๋„์ปค ์ปดํฌ์ฆˆ๋ž€? ์—ฌ๋Ÿฌ ๊ฐœ์˜ Docker ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋กœ ์ •์˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ด ํ•˜๋‚˜์˜ ๋ฌถ์Œ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ๋„์ปค ์ปดํฌ์ฆˆ ์„ค์น˜ # ๋„์ปค ์ปดํฌ์ฆˆ V2

hstory0208.tistory.com

 

https://velog.io/@suhongkim98/jenkins-%EB%8F%84%EC%BB%A4%EB%A1%9C-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0

 

jenkins ๋„์ปค๋กœ ์„ค์น˜ํ•˜๊ธฐ

์šฐ๋ถ„ํˆฌ์— ์  ํ‚จ์Šค๋ฅผ ๋„์ปค๋กœ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค

velog.io

 

728x90
๋ฐ˜์‘ํ˜•
728x90
๋ฐ˜์‘ํ˜•

๋Œ€๋žต์ ์ธ ๋ฐฐํฌ ์ˆœ์„œ...

  1. ec2 ๋ฐœ๊ธ‰
  2. ufw ์„ค์ • ๋ฐ port ๊ตฌ์„ฑ๋„
  3. swap ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •
  4. docker ์„ค์น˜
  5. docker-compose jenkins ์„ค์น˜
  6. jenkins gitlab ์—ฐ๋™(project-build) ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  7. dockerHub ์„ค์น˜ ๋ฐ ์—ฐ๋™(docker-build)
  8. dockerScript ์ž‘์„ฑ(pipeline)
  9. Nginx
  10. S3 ์„ค์น˜ ๋ฐ ์„ค์ •
  11. RDS ์„ค์น˜ ๋ฐ ์„ค์ •

 

EC2 ์„ค์ •

 

EC2 (Elastic Compute Cloud) ???

- ์•„๋งˆ์กด ์›น ์„œ๋น„์Šค(AWS) ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์„œ๋น„์Šค
- ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… ์ธํ„ฐ๋„ท(ํด๋ผ์šฐ๋“œ)์„ ํ†ตํ•ด ์„œ๋ฒ„, ์Šคํ† ๋ฆฌ์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์˜ ์ปดํ“จํŒ… ์„œ๋น„์Šค๋ฅผ ์ œ๊ณต
  => AWS ์—์„œ ์›๊ฒฉ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ์˜ ์ปดํ“จํ„ฐ๋ฅผ ํ•œ ๋Œ€ ๋นŒ๋ฆฌ๋Š” ๊ฒƒ
- ์‚ฌ์šฉํ•œ ๋งŒํผ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ„๋ ฅ์ ์ธ ์ด๋ผ๋Š” ์˜๋ฏธ์˜  Elastic์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค

์กฐ๊ธˆ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡๐Ÿ‘‡
https://velog.io/@server30sopt/AWS-EC2-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC



AWS ์—์„œ ์ง์ ‘ EC2๋ฅผ ๋‚ด๊ฐ€ ํ• ๋‹นํ•  ๋•Œ ์ฐธ์กฐํ•  ๋ธ”๋กœ๊ทธ
https://velog.io/@sunblock99/AWS-%ED%94%84%EB%A6%AC%ED%8B%B0%EC%96%B4-EC2-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[AWS] ํ”„๋ฆฌํ‹ฐ์–ด EC2 ์ธ์Šคํ„ด์Šค ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

1) AWS ๊ณ„์ • ์ƒ์„ฑ ๊ฐœ์ธ์ •๋ณด์™€ ๊ฒฐ์ œ ์นด๋“œ ๋“ฑ์„ ๋“ฑ๋กํ•ด์„œ ๊ฐ€์ž…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ธ๋‹น 1๊ณ„์ • ์ œํ•œ์ด ์—†์œผ๋‹ˆ ํ”„๋ฆฌํ‹ฐ์–ด ๊ธฐ๊ฐ„์ด ๋๋‚ฌ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ด๋ฉ”์ผ๋กœ ๊ฐ€์ž…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. 2) ์ธ์Šคํ„ด์Šค ์‹œ์ž‘ ๋ฉ”์ธ ํ™”๋ฉด์—์„œ EC2

velog.io

 

๋‚˜๋Š” ์‹ธํ”ผ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์„œ ์„ค์ •์„ ํ•ด์ฃผ์‹œ๊ณ  ๋ฐœ๊ธ‰ ๋ฐ›์•˜๋‹ค...

๋”ฐ๋กœ ํฌํŠธ ์„ค์ •์ด๋‚˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ•  ํ•„์š” X

 

 

ufw ์„ค์ • 

 

ufw(Uncomplicated Firewall; ๋ณต์žกํ•˜์ง€ ์•Š์€ ๋ฐฉํ™”๋ฒฝ) ??????

- ๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด ์šด์˜์ฒด์ œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉํ™”๋ฒฝ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ
- ๋ฆฌ๋ˆ…์Šค ์ปค๋„์€ ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ ๊ด€๋ จ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” netfilter(๋„ท ํ•„ํ„ฐ) ๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด UFW
- netfilter๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ๋ฐฉํ™”๋ฒฝ์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด iptables(๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ œ์–ด)๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉ
- ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ iptables๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ์—๋Š” ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ ˆ์ฐจ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด์ค€ ๊ฒƒ์ด UFW

 

 

๋ฐฉํ™”๋ฒฝ์ด๋ž€ ????

- ์ปดํ“จํ„ฐ์˜ ๋ณด์•ˆ์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ทœ์น™์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์ œ์–ดํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋ณด์•ˆ ์‹œ์Šคํ…œ
- ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€์˜ ์ •๋ณด ํ†ต์‹ ๋ง์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€์—์„œ ๋‚ด๋ถ€๋กœ ๋ถˆ๋ฒ•์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ์›€์ง์ž„์„ ์ฐจ๋‹จ
- ๋ชฉ์  : ์ธ๊ฐ€๋ฐ›์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ด๋ถ€ ์ปดํ“จํ„ฐ ์ž์›์„ ์‚ฌ์šฉ ๋˜๋Š” ๊ต๋ž€ํ•˜๊ฑฐ๋‚˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€์— ์œ ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
- ์ž‘๋™ ์›๋ฆฌ  : ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐฉํ™”๋ฒฝ์€ ๋ชจ๋“  ์ ‘๊ทผ์„ ๊ฑฐ๋ถ€ํ•˜๊ณ , ๋‹จ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๋Š” ํ†ต๋กœ๋ฅผ ํฌํŠธ(port)๋ผ ํ•˜๋Š”๋ฐ, ๋ฐฉํ™”๋ฒฝ์€ ์•ฝ 65,000๊ฐœ์˜ ํ†ต์‹  ํฌํŠธ๋ฅผ ๋ชจ๋‘ ์ฐจ๋‹จํ•˜๊ณ , ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ํŠน์ • ํฌํŠธ๋งŒ ์—ด์–ด๋‘”๋‹ค

 

 

.SSH(Secure Shell) ????

- ์›๊ฒฉ ํ˜ธ์ŠคํŠธ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ
- ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ•ด์„ํ•ด์„œ ์ปค๋„๋กœ ์˜ฎ๊ฒจ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ
- ๊ธฐ์กด ์›๊ฒฉ ์ ‘์†์€ Telnet ์ด๋ผ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด   ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” SSH ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ–ˆ๊ณ , ํ˜„์žฌ ์›๊ฒฉ ์ ‘์† ๋ณด์•ˆ์„ ์œ„ํ•œ ํ•„์ˆ˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค

 

 

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” VMware์—์„œ ๋ฐ”๋กœ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  puttygen์„ ์‚ฌ์šฉํ•ด์„œ ํ‚ค๋ฅผ ๋งŒ๋“ค๊ณ  ํŽธ์˜ ๊ธฐ๋Šฅ์„ฑ์˜ ํญ์„ ๋„“ํž˜

 

PuTTY

-  ์œˆ๋„์šฐ์šฉ ์˜คํ”ˆ์†Œ์Šค SHH ๋ฐ Telnet ํด๋ผ์ด์–ธํŠธ
-  ์›๊ฒฉ์œผ๋กœ ์„œ๋ฒ„ ๋ฐ ์žฅ์น˜์— ์—ฐ๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ๊ต‰์žฅํžˆ ๊ฐ€๋ณ๊ณ  ๊ฐ„ํŽธํ•ด์„œ ์‚ฌ์šฉ์„ฑ์ด ๋›ฐ์–ด๋‚จ
-  ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฐ•๋ ฅํ•œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์— ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋ฉฐ ์•”ํ˜ธ ์ธ์ฆ, ๊ณต๊ฐœ ํ‚ค ์ธ์ฆ ๋ฐ ํ‚ค๋ณด๋“œ ๋Œ€ํ™”์‹ ์ธ์ฆ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ์ธ์ฆ ๋ฐฉ๋ฒ•์„ ์ง€์›

 

https://www.puttygen.com/

 

PuTTYgen Download

Download PuTTYgen for Windows, Linux and Mac operating system. Find step by step guide to downloading PuTTYgen, a key generator for free.

www.puttygen.com

https://www.putty.org/

 

 

Download PuTTY - a free SSH and telnet client for Windows

Is Bitvise affiliated with PuTTY? Bitvise is not affiliated with PuTTY. We develop our SSH Server for Windows, which is compatible with PuTTY. Many PuTTY users are therefore our users as well. From time to time, they need to find the PuTTY download link. W

www.putty.org

  • ssh ์ ‘์†์„ ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™ ์ถ”๊ฐ€ํ•˜๊ธฐ
$ sudo ufw allow 22

 

  • ufw ํ™œ์„ฑํ™”ํ•˜๊ธฐ
$ sudo ufw enable

 

  • ufw ์ƒํƒœ ํ™•์ธํ•˜๊ธฐ
$ sudo ufw status

 

  • ํฌํŠธ ์ •์ƒ ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ
$ sudo ufw status numbered

 

 

EC2 ๋ณด์•ˆ๊ทธ๋ฃน

22 : ssh 

8080 : Springboot

80 : Nginx

6379 : Redis

5000 : Docker

3306 : Database

 

 

swap ๋ฉ”๋ชจ๋ฆฌ ์„ค์ •

swap memory ????

- ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ Ram์ด ๊ฐ€๋“ ์ฐผ์ง€๋งŒ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ด์šฉํ•˜์—ฌ ๋ถ€์กฑํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„
- ์‹ค์ œ ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ฌ๋ ค์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ์ข‹๋‹ค
 => ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด  ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ณด๋‹ค ๋œ ๋ฐ”๋žŒ์งํ•œ ์ด์œ 

1. ์†๋„ ์ฐจ์ด : ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ์— ์œ„์น˜ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ์ €์žฅ ์žฅ์น˜๋Š” RAM๋ณด๋‹ค ์ฝ๊ณ  ์“ฐ๋Š” ์†๋„๊ฐ€ ํ›จ์”ฌ ๋Š๋ ค์„œ ์‹œ์Šคํ…œ์ด ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚˜๊ณ  ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค
2. ์›จ์–ด ๋ผ๋ฒจ๋ง(Wear Leveling) : SSD์˜ ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์“ฐ๊ณ  ์ง€์šฐ๋Š” ์ž‘์—…์ด SSD์˜ ์ˆ˜๋ช…์„ ๋‹จ์ถ•
3. ์‹œ์Šคํ…œ ์ž์›์˜ ํšจ์œจ์  ์‚ฌ์šฉ :  ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ์™€ ์ž์› ํ• ๋‹น์— ์žˆ์–ด์„œ ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‚ด์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค
4. ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ : ์Šค์™‘ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” '์Šค์™‘ ์Šค๋ ˆ์‹ฑ' ํ˜„์ƒ์„ ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ์™€ ์Šค์™‘ ์˜์—ญ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™์‹œ์ผœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ˜„์ƒ์„ ๋งํ•˜๊ณ , ์‹œ์Šคํ…œ์ด ๋Š๋ ค์ง€๊ณ  ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค)

๊ทธ๋Ÿผ์—๋„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ??
: ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ ์ข…๋ฃŒ๋‚˜ ์‹œ์Šคํ…œ์˜ ๋ถˆ์•ˆ์ •์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค์™‘ ๊ณต๊ฐ„์„ ์ ์ ˆํžˆ ์„ค์ •ํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค!!

 

  1.  dd ๋ช…๋ น์–ด๋กœ swap ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

    dd : ๋””์Šคํฌ ๋ณต์‚ฌ ๋„๊ตฌ๋กœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ณต์‚ฌ
    if=/dev/zero : ์ž…๋ ฅ ํŒŒ์ผ๋กœ /dev/zero๋ฅผ ์‚ฌ์šฉ
    of=/swapfile : ์ถœ๋ ฅ ํŒŒ์ผ๋กœ /swapfile์„ ์ง€์ •
    bs=128M: ๋ธ”๋ก ์‚ฌ์ด์ฆˆ๋กœ 128 ๋ฉ”๊ฐ€ ๋ฐ”์ดํŠธ๋ฅผ ์ง€์ •(ํ•œ๋ฒˆ์— 128MB์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ)
    count=16 : ๋ธ”๋ก์„ ์ด 16๋ฒˆ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ(2GB์˜ ์Šค์™‘ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค)
sudo dd if=/dew/zero of=/swapfile bs=128M count= 16

 

 2. ์ƒ์„ฑํ•œ swapfile์˜ ๊ถŒํ•œ(์ฝ๊ธฐ, ์“ฐ๊ธฐ)๋ฅผ ์—…๋ฐ์ดํŠธ :๋ณด์•ˆ์ƒ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์–ด์•ผ ํ•จ!

sudo chmod 600 /swapfile

 

3. mkswap ๋ช…๋ น์–ด๋กœ swap ๊ณต๊ฐ„์„ ์ƒ์„ฑ : ์Šค์™‘ ๊ณต๊ฐ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์Šค์™‘ ํŒŒ์ผ์„ ์„ค์ •

sudo mkswap /swapfile

 

4. ์Šค์™‘ ํ™œ์„ฑํ™” : ์‹œ์Šคํ…œ์— ์Šค์™‘ ํŒŒ์ผ์„ ํ™œ์„ฑํ™”

sudo swapon /swapfile


5. /etc/fstab ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ๋ถ€ํŒ… ์‹œ ์Šค์™‘ ํŒŒ์ผ์„ ์‹œ์ž‘ํ•˜๊ฒŒ๋” ํ•จ

sudo vi /etc/fstab

 

6, ์Šค์™‘ ํŒŒ์ผ์„ ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธ ํ•˜๋„๋ก ์„ค์ •

/swapfile swap swap sw 0 0

 

์ฐธ๊ณ 

 

https://samgyeobsal123.tistory.com/entry/PuTTY-PuTTY-Key-Generator-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[PuTTY] PuTTY Key Generator ์‚ฌ์šฉ๋ฒ•

ํ•„์š”์‹œ aws์—์„œ ์ œ๊ณตํ•œ ํ”„๋ผ์ด๋น— ํ‚ค ํŒŒ์ผ์„ PuTTY์— ๋งž๋Š” ํ™•์žฅ์ž์ธ PPK๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. PuTTY๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์„ค์น˜ํ–ˆ์œผ๋ฉด PuTTY Key Generator (์ดํ•˜ ํ‚ค์  )์„ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜ ํ™”๋ฉด์ด ๋œฌ๋‹ค. Load๋ฅผ ๋ˆŒ

samgyeobsal123.tistory.com

puttygen ์‚ฌ์šฉ๋ฒ•...

 

 

https://calvinjmkim.tistory.com/20

 

PEMํŒŒ์ผ์„ PPK๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ (PEM to PPK)

์œˆ๋„์šฐ์ฆˆ์—์„œ ๊ฐ„๋‹จํ•œ ํ„ฐ๋ฏธ๋„ ํˆด์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐ๋‚˜๋Š” ํˆด์ด Putty์ด๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋งŒ ๊ฐ–์ถ”๊ณ  ์žˆ๊ณ , ๊ฐ„๋‹จํ•˜๊ณ , ์„ค์น˜ํ•  ํ•„์š”๋„ ์—†๊ณ , ์šฉ๋Ÿ‰๋งˆ์ € ์ž‘์€ ๊ฒƒ์ด ๊ทธ ๋งค๋ ฅ์ด ์•„๋‹๊นŒ ์‹ถ

calvinjmkim.tistory.com

ppk๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ด์œ ..

728x90
๋ฐ˜์‘ํ˜•

+ Recent posts