Avatar
๐Ÿ˜‰

Organizations

  • @Component ๋‚ด์— static method ์—์„œ ์“ฐ๋Š” member ๊ฐ์ฒด๊ฐ€ null ์ผ๋–„

    @Component ๋‚ด์— static method์—์„œ ์‚ฌ์šฉํ•˜๋Š” static member

    @Component
    @RequiredArgsConstructor
    public class SomeComponentClass {
    
        private final ObjectMapper objectMapper;
    
        private static void staticMethod() {
            objectMapper.convertValue() // objectMapper NullPointerException ๋ฐœ์ƒ
        } 
    }
    

    -> ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ์„ธ์š”.

    @Component
    @RequiredArgsConstructor
    public class SomeComponentClass {
    
        private static ObjectMapper objectMapper;
    
        // Autowired๋กœ constructor ์ƒ์„ฑ
        @Autowired
        public SomeComponentClass(ObjectMapper objectMapper) {
            SomeComponentClass.objectMapper = objectMapper;
        }
    
        private static void staticMethod() {
            objectMapper ~~~
        }
    }
    
    Created Sat, 25 Jan 2025 17:14:05 +0900
  • ์„œ๋ก 

    • GitHub์—์„œ **ํƒœ๊ทธ(Tag)**๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **๋ฆด๋ฆฌ์ฆˆ(Release)**๋ฅผ ๋งŒ๋“ค๋ฉด,
    • ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ(zip, tar.gz ๋“ฑ)์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ฐฐํฌ์— ์•„์ฃผ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค..
    • ์•„๋ž˜์— GitHub ๋ฆด๋ฆฌ์ฆˆ ์ƒ์„ฑ ๋ฐ ์—ฐ๋™ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‡

    ๐ŸŽ GitHub ๋ฆด๋ฆฌ์ฆˆ๋ž€?

    • ํŠน์ • ํƒœ๊ทธ์— ๋Œ€ํ•œ ๋ฆด๋ฆฌ์ฆˆ ์ •๋ณด๋ฅผ ์‹œ๊ฐํ™”ํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” GitHub์˜ ๊ธฐ๋Šฅ
    • ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ
    • ์‹คํ–‰ ํŒŒ์ผ, ์•„ํ‹ฐํŒฉํŠธ(.zip, .jar ๋“ฑ) ์ฒจ๋ถ€ ๊ฐ€๋Šฅ
    • GitHub Actions ๊ฐ™์€ CI ๋„๊ตฌ์™€ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ

    ๐Ÿ› ๏ธ GitHub ๋ฆด๋ฆฌ์ฆˆ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

    1. Git ํƒœ๊ทธ ๋งŒ๋“ค๊ธฐ (๋กœ์ปฌ or GitHub์—์„œ)

    # ๋กœ์ปฌ์—์„œ annotated tag ๋งŒ๋“ค๊ธฐ
    git tag -a v1.0.0 -m "Release version 1.0.0"
    
    # ์›๊ฒฉ ํ‘ธ์‹œ
    git push origin v1.0.0
    

    ๋˜๋Š” GitHub ์›น UI์—์„œ ์ƒˆ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Œ.

    Created Sat, 11 Jan 2025 16:11:03 +0900
  • git ์—์„œ tag๋Š” ์–ธ์ œ ์“ฐ๊ณ  ์–ด๋–ป๊ฒŒ ์“ธ๊นŒ?

    • Git์—์„œ **tag(ํƒœ๊ทธ)**๋Š” ํŠน์ • ์ปค๋ฐ‹์— ์ด๋ฆ„์„ ๋ถ™์—ฌ์„œ ์‹๋ณ„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆ ๋ฒ„์ „์„ ํ‘œ์‹œํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ํŠน์ • ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    ๐ŸŽฏ ํƒœ๊ทธ์˜ ์ฃผ์š” ์—ญํ• 

    1. ๋ฆด๋ฆฌ์ฆˆ ๋งˆํ‚น

      • ์˜ˆ: v1.0.0, v2.1.3
      • ๋ฐฐํฌํ•œ ๋ฒ„์ „์ด ์–ด๋–ค ์ปค๋ฐ‹์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ์Šค๋ƒ…์ƒท ์ €์žฅ

      • ํŠน์ • ์ปค๋ฐ‹์— ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ (์˜ˆ: ์ฒซ ๋ฐฐํฌ, ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ์ง€์  ๋“ฑ)
    3. CI/CD ํŠธ๋ฆฌ๊ฑฐ์šฉ

      • ํƒœ๊ทธ๊ฐ€ push๋  ๋•Œ ์ž๋™ ๋ฐฐํฌ๋˜๋„๋ก CI ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •์ด ๊ฐ€๋Šฅ

    ๐Ÿ› ๏ธ ํƒœ๊ทธ์˜ ์ข…๋ฅ˜

    1. Lightweight Tag (๊ฐ€๋ฒผ์šด ํƒœ๊ทธ)
      • ๋‹จ์ˆœํžˆ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ
      • Git ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ธŒ๋žœ์น˜์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ
      git tag v1.0.0
      
    2. Annotated Tag (์ฃผ์„์ด ์žˆ๋Š” ํƒœ๊ทธ)
      • ํƒœ๊ทธ ์ƒ์„ฑ์ž ์ •๋ณด, ๋‚ ์งœ, ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ํฌํ•จ
      • ๋ฆด๋ฆฌ์ฆˆ์—๋Š” ๋ณดํ†ต ์ด๊ฑธ ์‚ฌ์šฉ
      git tag -a v1.0.0 -m "Release version 1.0.0"
      

    ๐Ÿ“ค ํƒœ๊ทธ ํ‘ธ์‹œ ๋ฐ ๊ณต์œ 

    • ํƒœ๊ทธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ git push๋กœ ์ž๋™ ํ‘ธ์‹œ๋˜์ง€ ์•Š์Œ. ๋ช…์‹œ์ ์œผ๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•จ:
      # ํŠน์ • ํƒœ๊ทธ ํ‘ธ์‹œ
      git push origin v1.0.0
      
      # ๋ชจ๋“  ํƒœ๊ทธ ํ‘ธ์‹œ
      git push origin --tags
      

    ๐Ÿ” ํƒœ๊ทธ ํ™•์ธ

    # ๋กœ์ปฌ ํƒœ๊ทธ ๋ชฉ๋ก
    git tag
    
    # ํŠน์ • ํƒœ๊ทธ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹ ๋ณด๊ธฐ
    git show v1.0.0
    

    ๐Ÿงฝ ํƒœ๊ทธ ์‚ญ์ œ

    # ๋กœ์ปฌ ํƒœ๊ทธ ์‚ญ์ œ
    git tag -d v1.0.0
    
    # ์›๊ฒฉ ํƒœ๊ทธ ์‚ญ์ œ
    git push origin --delete v1.0.0
    

    ๐Ÿ“ฆ ํ™œ์šฉ ์˜ˆ์‹œ (๋ฆด๋ฆฌ์ฆˆ ๊ด€๋ฆฌ)

    # ์ฝ”๋“œ๊ฐ€ ์•ˆ์ •ํ™”๋œ ์‹œ์ 
    git checkout main
    git pull
    git tag -a v1.0.0 -m "First stable release"
    git push origin v1.0.0
    
    • CI/CD ๋„๊ตฌ(GitHub Actions, Jenkins ๋“ฑ)๋Š” ์ด ํƒœ๊ทธ๋ฅผ ๊ฐ์ง€ํ•ด์„œ v1.0.0์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Created Sat, 04 Jan 2025 13:18:03 +0900
  • Spring ์—์„œ (boot ํฌํ•จ) component์™€ bean์˜ ์ฐจ์ด๋Š”?

    Spring Boot (์ •ํ™•ํžˆ๋Š” Spring Framework)์—์„œ @Component์™€ @Bean์€ ๋ชจ๋‘ Spring ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ์ฒด(๋นˆ, Bean)๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋ชฉ์ ์ด ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.


    ๐Ÿ”น 1. @Component

    • ํด๋ž˜์Šค์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
    • Spring์ด ์ž๋™์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋ก
    • @ComponentScan์— ์˜ํ•ด ํƒ์ง€๋˜์–ด ๋“ฑ๋ก๋จ
    @Component
    public class MyComponent {
        public void doSomething() {
            System.out.println("Component is working");
        }
    }
    

    โœ… ํŠน์ง•

    • ์ž๋™ ๋“ฑ๋ก
    • @Service, @Repository, @Controller๋„ ์‚ฌ์‹ค @Component์˜ ํŠน์ˆ˜ํ™” ๋ฒ„์ „
    • ํŒจํ‚ค์ง€ ์Šค์บ” ๊ฒฝ๋กœ ์•ˆ์— ์žˆ์–ด์•ผ ํ•จ

    ๐Ÿ”น 2. @Bean

    • ๋ฉ”์„œ๋“œ์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
    • ์ฃผ๋กœ @Configuration ํด๋ž˜์Šค ์•ˆ์—์„œ ์‚ฌ์šฉ
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ Spring ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก
    @Configuration
    public class AppConfig {
        @Bean
        public MyComponent myComponent() {
            return new MyComponent(); // ์ˆ˜๋™ ๋“ฑ๋ก
        }
    }
    

    โœ… ํŠน์ง•

    • ์ˆ˜๋™ ๋“ฑ๋ก
    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด, ์„ค์ •๊ฐ’์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋“ฑ ์œ ์—ฐํ•œ ๊ฐ์ฒด ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋นˆ ์ด๋ฆ„์ด ๋จ (ํ•„์š”์‹œ @Bean(name = "beanName")์œผ๋กœ ์ง€์ • ๊ฐ€๋Šฅ)

    ๐Ÿ“Œ ์ •๋ฆฌ

    ํ•ญ๋ชฉ @Component @Bean
    ๋ถ™์ด๋Š” ์œ„์น˜ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ
    ๋“ฑ๋ก ๋ฐฉ์‹ ์ž๋™ ๋“ฑ๋ก (์ปดํฌ๋„ŒํŠธ ์Šค์บ”) ์ˆ˜๋™ ๋“ฑ๋ก (๊ฐœ๋ฐœ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ƒ์„ฑ)
    ์‚ฌ์šฉ ์šฉ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€ ํด๋ž˜์Šค ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋ณต์žกํ•œ ์ดˆ๊ธฐํ™”
    ์„ค์ • ํด๋ž˜์Šค ํ•„์š” ์—ฌ๋ถ€ ํ•„์š” ์—†์Œ @Configuration ํ•„์š”

    ๐Ÿ™‹ ์–ธ์ œ ์จ์•ผ ํ• ๊นŒ?

    • ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด โ†’ @Component
    • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ์ฒด๋‚˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฐ์ฒด ์ƒ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ โ†’ @Bean
    Created Sat, 21 Dec 2024 17:14:05 +0900
  • @Value ์˜ ๊ฐ’์ด ๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š์œผ์‹ ๊ฐ€์š”?

    • Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰์‹œํ‚ฌ ๋–„ @Value๋กœ (org.springframework.beans.factory.annotation.Value) ๊ฐ’์„ ์ฃผ์ž…ํ•˜๋ ค๊ณ  ํ• ๋–„ ์ƒ๊ฐ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ @Value๋กœ ์ฃผ์ž…ํ•œ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด๋Ÿฌํ•œ ํ˜„์ƒ์€ ์™œ ์ƒ๊ธฐ๋ฉฐ, ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    • ์šฐ์„  Spring Boot๋ฅผ ์‹คํ–‰์‹œํ‚ฌ๋–„ loading ์ˆœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋จผ์ € ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    • Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ์˜ ๋กœ๋”ฉ ์ˆœ์„œ๋Š” ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์ˆœ์„œ๋Š” Spring Framework์˜ ๋™์ž‘ ์›๋ฆฌ์— ๊ธฐ๋ฐ˜ํ•˜๋ฉฐ, Spring Boot ํŠน์œ ์˜ ๊ธฐ๋Šฅ๋“ค์ด ์ถ”๊ฐ€์ ์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

    Created Wed, 27 Nov 2024 17:14:05 +0900
  • GoDoc GoDoc

    Clean Code ์„œ๋ก 

    Abstract

    ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž์ผ์ˆ˜๋ก ์ผ๋‹จ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์šฐ์„ ์œผ๋กœ ์ƒ๊ฐํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ๋Œ€์ฒด๋กœ ์ฝ”๋“œ์˜ ํ€„๋ฆฌํ‹ฐ๋Š” ๋’ท์ „์ด๊ณ  ์ƒ๊ฐํ•œ ๊ธฐ๋Šฅ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฉด ํ•  ์ผ์„ ๋‹คํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์•„๋‹ˆ, ๋น„๋‹จ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋งŒ์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค. ์—…๊ณ„์— ์žˆ์œผ๋ฉด์„œ ๋ณด์•„์˜จ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์„ ๋Œ์•„๋ดค์„ ๋•Œ, ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ƒ๊ฐํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๋ฆฌ ๋งŽ์ง€ ์•Š์•˜๋‹ค. ์‹ฌ์ง€์–ด Clean Code๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๋Š” ์‚ฌ๋žŒ๋„ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ฝ”๋“œ์—๋„ ํ’ˆ์งˆ์ด๋ผ๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์กด์žฌํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์–ด๋А ์ •๋„์˜ ํ’ˆ์งˆ ์ˆ˜์ค€์„ ๊ฐ–์ถ”์—ˆ๋Š”๊ฐ€๋Š” ๊ฐ๊ด€์ ์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” dirty ํ•˜์ง€ ์•Š์€ cleanํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

    Created Wed, 27 Nov 2024 17:14:05 +0900
Previous