Avatar
๐Ÿ˜‰

Organizations

  • โœ… ์„œ๋ธŒ๋ชจ๋“ˆ ์™„์ „ํžˆ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋‹ค์‹œ ์…‹ํŒ…

    1. ์„œ๋ธŒ๋ชจ๋“ˆ์„ Git์—์„œ ๋จผ์ € ์ œ๊ฑฐ

      git submodule deinit -f .
      
    2. ์„œ๋ธŒ๋ชจ๋“ˆ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ œ๊ฑฐ

      rm -rf .git/modules/<์„œ๋ธŒ๋ชจ๋“ˆ_์ด๋ฆ„>
      rm -rf <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
      
    3. .gitmodules ํŒŒ์ผ ์‚ญ์ œ

      rm .gitmodules
      
    4. ์ธ๋ฑ์Šค์—์„œ ์„œ๋ธŒ๋ชจ๋“ˆ ํ”์  ์ œ๊ฑฐ

      git rm --cached <์„œ๋ธŒ๋ชจ๋“ˆ_๋””๋ ‰ํ† ๋ฆฌ>
      
    5. ์ปค๋ฐ‹

      git commit -m "Remove submodule completely"
      
    6. ์ƒˆ๋กœ์šด ์„œ๋ธŒ๋ชจ๋“ˆ ์ถ”๊ฐ€ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ)

      git submodule add <repo-url> <path>
      git commit -m "Add submodule"
      

    ๐Ÿง  ์ •๋ฆฌํ•˜์ž๋ฉด:

    • ๋‹จ์ˆœํžˆ .gitmodules ํŒŒ์ผ๋งŒ ์ง€์šฐ๋ฉด ์•ˆ ๋˜๊ณ ,
    • Git ๋‚ด๋ถ€์˜ ์„œ๋ธŒ๋ชจ๋“ˆ ์ •๋ณด (.git/modules, ์ธ๋ฑ์Šค ๋“ฑ)๋„ ๊ฐ™์ด ์ •๋ฆฌํ•ด์ค˜์•ผ ํ•ด์š”.
    Created Tue, 01 Apr 2025 11:25:45 +0900
  • k8s๋ž€?

    **Kubernetes (k8s)**๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌ, ํ™•์žฅ, ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ๊ตฌ๊ธ€์—์„œ ๊ฐœ๋ฐœํ•œ ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ CNCF(Cloud Native Computing Foundation)์— ๊ธฐ๋ถ€๋˜์—ˆ๊ณ , ํ˜„์žฌ๋Š” ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด์—์š”.


    ํ•ต์‹ฌ ๊ฐœ๋… ์ •๋ฆฌ

    • ์ปจํ…Œ์ด๋„ˆ(Container): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ทธ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ํŒจํ‚ค์ง•ํ•œ ๋‹จ์œ„ (์ฃผ๋กœ Docker ์‚ฌ์šฉ)
    • Pod: Kubernetes์˜ ๊ฐ€์žฅ ์ž‘์€ ๋ฐฐํฌ ๋‹จ์œ„. ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด์š”.
    • Node: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰๋˜๋Š” ๋ฌผ๋ฆฌ/๊ฐ€์ƒ ๋จธ์‹ 
    • Cluster: ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ Kubernetes์˜ ์ „์ฒด ์ธํ”„๋ผ
    • Deployment: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์›ํ•˜๋Š” ์ƒํƒœ(์˜ˆ: ๋ช‡ ๊ฐœ์˜ ๋ณต์ œ๋ณธ ์œ ์ง€ ๋“ฑ)๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌ
    • Service: Pod์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ์ œ๊ณต (LoadBalancer, ClusterIP, NodePort ๋“ฑ)
    • Ingress: ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•ด์ฃผ๋Š” HTTP(S) ๋ ˆ๋ฒจ ๋ผ์šฐํ„ฐ
    • ConfigMap / Secret: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ๊ฐ’์ด๋‚˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…

    Kubernetes์˜ ์žฅ์ 

    • ์ž๋™ํ™”๋œ ๋ฐฐํฌ ๋ฐ ๋กค๋ฐฑ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌ/์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ž๋™์œผ๋กœ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ ๊ฐ€๋Šฅ
    • ์ž๋™ ์Šค์ผ€์ผ๋ง: ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ Pod ์ˆ˜๋ฅผ ์ž๋™ ์กฐ์ ˆ ๊ฐ€๋Šฅ
    • ์ž๊ฐ€ ์น˜์œ (Self-healing): ์žฅ์•  ๋‚œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์ƒ์„ฑ
    • ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: Pod ๊ฐ„ ํ†ต์‹ ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ

    ๊ฐ„๋‹จํ•œ ๋™์ž‘ ํ๋ฆ„

    1. ์‚ฌ์šฉ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปจํ…Œ์ด๋„ˆ(Docker)๋กœ ํŒจํ‚ค์ง•
    2. ์ด๋ฅผ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌ
    3. Kubernetes๊ฐ€ ์ด๋ฅผ ์ ์ ˆํ•œ Node์— ์Šค์ผ€์ค„๋งํ•˜๊ณ  ์‹คํ–‰
    4. ์„œ๋น„์Šค๋‚˜ Ingress๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์ ‘๊ทผ ๊ฐ€๋Šฅ

    helm ์ด๋ž€?

    Helm์€ Kubernetes์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, Kubernetes์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์‰ฝ๊ณ , ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋งˆ์น˜ apt(Ubuntu), brew(macOS), npm(Node.js) ๊ฐ™์€ ๋А๋‚Œ.

    Created Mon, 31 Mar 2025 12:48:01 +0900
  • PreFlightCorsConfig example

    @Configuration
    public class PreFlightCorsConfig {
    
        private final CorsProperties corsProperties;
    
        public PreFlightCorsConfig(CorsProperties corsProperties) {
            this.corsProperties = corsProperties;
        }
    
        private static final String ALLOWED_HEADERS = "x-requested-with,authorization, refresh-token,Access-Control-Allow-Origin,Content-Type, credential,X-AUTH-TOKEN,X-CSRF-TOKEN";
    
        private static final String ALLOWED_METHODS = "GET, PUT, POST, PATCH, DELETE, OPTIONS";
    
        private static final String ALLOWED_CREDENTIALS = "true";
    
        // ์ค‘์š” ํ•ด๋‹น ํ—ค๋”๊ฐ€ ์—†๋‹ค๋ฉด axios๋ฅผ ํ†ตํ•œ ํ”„๋ก ํŠธ์—์„œ ํ™•์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ
        private static final String EXPOSE_HEADERS = "*,Authorization,Refresh-token,authorization,refresh-token";
    
        private static final String MAX_AGE = "3600";
    
        @Bean
        public WebFilter corsFilter() {
            return (ServerWebExchange ctx, WebFilterChain chain) -> {
                ServerHttpRequest request = ctx.getRequest();
                String requestOrigin = request.getHeaders().getOrigin();
    
                if (CorsUtils.isPreFlightRequest(request)) {
                    ServerHttpResponse response = ctx.getResponse();
                    HttpHeaders headers = response.getHeaders();
    
                    if (requestOrigin != null && corsProperties.getAllowedOrigins().contains(requestOrigin)) {
                        headers.add("Access-Control-Allow-Origin", requestOrigin);
                    }
    
                    headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
                    headers.add("Access-Control-Max-Age", MAX_AGE);
                    headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);
                    headers.add("Access-Control-Allow-Credentials", ALLOWED_CREDENTIALS);
                    headers.add("Access-Control-Expose-Headers", EXPOSE_HEADERS);
    
                    // ํ”„๋ก ํŠธ์—์„œ ํ•ด๋‹น ํ—ค๋”๋ฅผ ํ™•์ธํ• ์ˆ˜์ž‡๊ฒŒ ํ—ˆ๊ฐ€ํ•ด์คŒ
                    headers.add("Access-Control-Expose-Headers", EXPOSE_HEADERS);
                    if (request.getMethod() == HttpMethod.OPTIONS) {
                        response.setStatusCode(HttpStatus.OK);
                        return Mono.empty();
                    }
                }
    
                return chain.filter(ctx);
            };
        }
    }
    

    CorsProperties

    @Component
    @Getter
    @Setter
    @ConfigurationProperties(prefix = "app.cors")
    public class CorsProperties {
    
        private List<String> allowedOrigins = new ArrayList<>();
    }
    

    ์„ค์ •

    • dev, prod profile ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ 
    # application-dev.yml
    cors:
      allowed-origins:
        - "http://localhost:3000"
        - "http://127.0.0.1:3000"
    
    # application-prod.yml
    cors:
      allowed-origins:
        - "https://example.com"
        - "https://another-domain.com"
    

    spspring-cloud-starter-gateway ์‚ฌ์šฉ์‹œ

    Spring Cloud Gateway๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด PreFlightCorsConfig ๊ฐ™์€ ๋ณ„๋„์˜ Java Config ์—†์ด๋„ application.yml์— ์„ค์ •๋งŒ์œผ๋กœ CORS ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.**

    Created Mon, 31 Mar 2025 00:49:17 +0900
  • Spring์„ ํฌํ•จํ•œ Java ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ **VO(Value Object)**์™€ **DTO(Data Transfer Object)**๋Š” ๊ฐœ๋…์ ์œผ๋กœ ๋น„์Šทํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ๋ชฉ์ ๊ณผ ์‚ฌ์šฉํ•˜๋Š” ๋งฅ๋ฝ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ๊ฐ๊ฐ์„ ์„ค๋ช…ํ•˜๊ณ  ์ฐจ์ด๋ฅผ ์ •๋ฆฌํ• ๊ฒŒ์š”.


    1. VO (Value Object)

    • ์˜๋ฏธ: ๊ฐ’ ์ž์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด. ๊ฐ’์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•  ๋•Œ, ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ฐ’์ด ๊ฐ™์€์ง€๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ง•:
      • **๋ถˆ๋ณ€(Immutable)**ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
      • equals(), hashCode()๋ฅผ ์žฌ์ •์˜ํ•ด์„œ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๋™์ผํ•œ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
      • ์ฃผ๋กœ ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠน์ • ๊ฐœ๋…(์˜ˆ: ์ฃผ์†Œ, ๋ˆ, ์ด๋ฆ„ ๋“ฑ)์„ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค.
    public class Address {
        private final String city;
        private final String street;
    
        public Address(String city, String street) {
            this.city = city;
            this.street = street;
        }
    
        // equals, hashCode ๋ฐ˜๋“œ์‹œ ์žฌ์ •์˜
    }
    

    2. DTO (Data Transfer Object)

    • ์˜๋ฏธ: ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด (์˜ˆ: Controller โ†’ Service โ†’ Repository)
    • ํŠน์ง•:
      • ๋ถˆ๋ณ€์ผ ํ•„์š” ์—†์Œ, Getter/Setter ์žˆ์Œ
      • ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ธฐ๋Š” ๋ชฉ์  (๋กœ์ง์ด ์—†์–ด์•ผ ํ•จ)
      • ๋ณดํ†ต ์ž…๋ ฅ(Request), **์ถœ๋ ฅ(Response)**์šฉ์œผ๋กœ ๋งŽ์ด ์“ฐ์ž„
    public class UserResponseDto {
        private String name;
        private String email;
    
        // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž, getter/setter
    }
    

    ์ •๋ฆฌ: VO vs DTO

    ํ•ญ๋ชฉ VO (Value Object) DTO (Data Transfer Object)
    ๋ชฉ์  ๊ฐ’ ์ž์ฒด๋ฅผ ํ‘œํ˜„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
    ๋ถˆ๋ณ€์„ฑ ๋ณดํ†ต ๋ถˆ๋ณ€ ๋ณดํ†ต ๊ฐ€๋ณ€
    ์‚ฌ์šฉ ์œ„์น˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ณ„์ธต ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
    equals/hashCode ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ์žฌ์ •์˜ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ์ •์˜ํ•˜์ง€ ์•Š์Œ
    ๋กœ์ง ํฌํ•จ ๊ฐ€๋Šฅ ์—†์Œ (์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ๋งŒ)

    ์‚ฌ์šฉ ์˜ˆ์‹œ

    ๊ฐ„๋‹จํ•œ Spring ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ์—์„œ VO์™€ DTO์˜ ์ฐจ์ด๋ฅผ ์‹ค์ œ ์˜ˆ์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” โ€œ์‚ฌ์šฉ์ž(User) ์ •๋ณด ์ฒ˜๋ฆฌโ€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    Created Sun, 30 Mar 2025 17:14:05 +0900
  • JPA์ฟผ๋ฆฌ๋ฅผ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ yml ์„ค์ •

    Spring Boot์—์„œ JPA ์ฟผ๋ฆฌ๋ฅผ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด application.yml ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

    spring:
      jpa:
        show-sql: true # SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅ
        properties:
          hibernate:
            format_sql: true # SQL ์ฟผ๋ฆฌ๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ ํฌ๋งท
      logging:
        level:
          org.hibernate.SQL: debug         # ์‹คํ–‰๋˜๋Š” SQL ๋กœ๊ทธ
          org.hibernate.type.descriptor.sql.BasicBinder: trace # ๋ฐ”์ธ๋”ฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’ ๋กœ๊ทธ
    

    ์„ค๋ช…:

    • show-sql: Hibernate๊ฐ€ ์‹คํ–‰ํ•˜๋Š” SQL์„ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ๋ณด์—ฌ์คŒ (๊ฐ„๋‹จํ•œ ๋กœ๊ทธ).
    • format_sql: SQL ์ฟผ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ค„๋ฐ”๊ฟˆ ๋ฐ ๋“ค์—ฌ์“ฐ๊ธฐ.
    • logging.level.org.hibernate.SQL: ๋” ์ƒ์„ธํ•œ SQL ๋กœ๊ทธ (๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ ํ†ตํ•ด ์ถœ๋ ฅ).
    • logging.level.org.hibernate.type.descriptor.sql.BasicBinder: SQL์— ๋ฐ”์ธ๋”ฉ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ.

    ๐Ÿ’ก ํŒŒ๋ผ๋ฏธํ„ฐ ๋กœ๊ทธ๋Š” ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”.

    Created Fri, 28 Mar 2025 13:25:03 +0900
  • Spring Cloud Gateway์—์„œ globalcors ์„ค์ •

    • ํŠน์ • URI ํŒจํ„ด์— ๋Œ€ํ•ด์„œ๋งŒ CORS๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์„ค์ •ํ•œ cors-configurations ํ‚ค์˜ ํŒจํ„ด์„ ์„ธ๋ถ„ํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ๋Š” ‘/**‘๋กœ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด /api/public/** ์ฒ˜๋Ÿผ ํŠน์ • ๊ฒฝ๋กœ๋กœ ์ขํ˜€์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    Spring Cloud Gateway์—์„œ globalcors ์„ค์ •์„ ์‚ฌ์šฉํ•  ๋•Œ ํŠน์ • URI ํŒจํ„ด์— ๋Œ€ํ•ด์„œ๋งŒ CORS๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์„ค์ •ํ•œ cors-configurations ํ‚ค์˜ ํŒจํ„ด์„ ์„ธ๋ถ„ํ™”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” '/\*\*'๋กœ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด ์˜ˆ๋ฅผ ๋“ค์–ด /api/public/** ์ฒ˜๋Ÿผ ํŠน์ • ๊ฒฝ๋กœ๋กœ ์ขํ˜€์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    Created Fri, 28 Mar 2025 11:41:41 +0900