Avatar
๐Ÿ˜‰

Organizations

  • AES key์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ฑ

    • ๋ณธ ํฌ์ŠคํŠธ๋Š” AES Key๋Š” ์–ด๋–ค ์‹์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋ณด๊ด€ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ChatGPT์˜ ์˜๊ฒฌ?์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    ์งˆ๋ฌธ

    • AES/CBC/PKCS5Padding 256 ์œผ๋กœ ์•”๋ณตํ™”ํ• ๋•Œ secret key๋ฅผ
    1. ๋ฐ”์ด๋„ˆ๋ฆฌ 32byte๋ฅผ base64 encodeํ•ด์„œ ์ €์žฅํ•ด๋†“๊ณ  ์•”๋ณตํ˜ธํ™”์‹œ decodeํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    2. ์˜๋‹จ์–ด ์กฐํ•ฉ 32byte ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ด๋†“๊ณ  ์‚ฌ์šฉ
    3. ์˜๋‹จ์–ด์™€ _ ์กฐํ•ฉ 32byte ๋ฅผ base64 encodeํ•ด์„œ ์ €์žฅ
    4. ์˜,์ˆซ์ž,ํŠน์ˆ˜๋ฌธ์ž ์กฐํ•ฉ์˜ ๋žœ๋ค์ŠคํŠธ๋ง 32byte๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋ณด์•ˆ์ƒ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ๊ฐ€

    ๋‹ต๋ณ€

    AES/CBC/PKCS5Padding 256 ์•”ํ˜ธํ™”์—์„œ SecretKey๋ฅผ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€ ๋ณด์•ˆ์— ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ 4๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ ๋ณด์•ˆ์ƒ ๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ํŒ๋‹จํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

    Created Sat, 12 Apr 2025 16:18:45 +0900
  • ์„œ๋ฒ„ ์‘๋‹ต ์ง€์—ฐ์ด๋‚˜ Timeout ๊ด€๋ จ ์ด์Šˆ๋ฅผ ์ถ”์ ํ•˜๋ ค๋ฉด, ์š”์ฒญ/์‘๋‹ต ์‹œ๊ฐ„ ๋กœ๊ทธ๋ฅผ ์ง์ ‘ ๋‚จ๊ธฐ๊ฑฐ๋‚˜, Spring์— ์ปค์Šคํ…€ Filter ๋˜๋Š” Feign Logger ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์•„์ฃผ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค ๋ชจ๋‘ ๋‹ค๋ค„๋ณผ๊ฒŒ์š”.


    โœ… 1. Feign ์š”์ฒญ/์‘๋‹ต ์‹œ๊ฐ„ ๋กœ๊น… ํ•„ํ„ฐ

    ๐Ÿ”ง ์š”์ฒญ ์ „์— ์‹œ๊ฐ„ ์ €์žฅ โ†’ ์‘๋‹ต ํ›„ ์†Œ์š” ์‹œ๊ฐ„ ์ธก์ •

    @Component
    public class FeignRequestTimingInterceptor implements RequestInterceptor {
    
        private static final Logger log = LoggerFactory.getLogger(FeignRequestTimingInterceptor.class);
    
        @Override
        public void apply(RequestTemplate template) {
            template.header("X-Request-Start-Time", String.valueOf(System.currentTimeMillis()));
        }
    }
    

    ๊ทธ๋ฆฌ๊ณ  ErrorDecoder๋‚˜ FeignClientExceptionDecoder ์—์„œ ์‹œ๊ฐ„ ๋กœ๊ทธ ์ถœ๋ ฅ:

    Created Fri, 11 Apr 2025 18:54:11 +0900
  • @JsonIgnore๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํ•„๋“œ๋Š” JSON ๋ณ€ํ™˜ ์‹œ ๋ฌด์กฐ๊ฑด ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ’์ด ์žˆ๋“  ์—†๋“  ๊ด€๊ณ„์—†์ด JSON ๊ฒฐ๊ณผ์— ํ•„๋“œ ์ž์ฒด๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    ์˜ˆ์‹œ๋กœ ๋ณด๋ฉด:

    public class User {
        private String name;
    
        @JsonIgnore
        private String password;
    
        // getters/setters
    }
    

    ์œ„ ๊ฐ์ฒด๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด (์˜ˆ: name="Alice", password="secret"์ด๋”๋ผ๋„):

    {
      "name": "Alice"
    }
    

    password ํ•„๋“œ๋Š” ๋ฌด์กฐ๊ฑด ๋น ์ง‘๋‹ˆ๋‹ค.


    ๋ฐ˜๋ฉด, ๊ฐ’์ด ์—†์„ ๋•Œ๋งŒ ํ•„๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @JsonInclude๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

    Created Tue, 08 Apr 2025 17:42:13 +0900
  • Rest API๋ž€ ๋ฌด์—‡์ด๋ฉฐ, RestFul ํ•˜๋‹ค๋Š” ๊ฑด ์–ด๋–ค ์˜๋ฏธ์ธ๊ฐ€?

    REST API์™€ RESTful์˜ ๊ฐœ๋…์€ ์›น ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜์ง€๋งŒ, ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์–ด์š”. ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์„ค๋ช…ํ•ด๋ณผ๊ฒŒ์š”.


    ๐Ÿ”น REST API๋ž€?

    REST๋Š” “REpresentational State Transfer"์˜ ์•ฝ์ž์˜ˆ์š”. 2000๋…„์— ๋กœ์ด ํ•„๋”ฉ(Roy Fielding)์ด ๋…ผ๋ฌธ์—์„œ ์ œ์•ˆํ•œ ์›น ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ ์ค‘ ํ•˜๋‚˜์ฃ .

    ์ฆ‰, REST API๋Š” ์ด REST ์›์น™์— ๋”ฐ๋ผ ์„ค๊ณ„๋œ ์›น API๋ฅผ ๋งํ•ด์š”.


    ๐Ÿ”น REST์˜ ํ•ต์‹ฌ ๊ฐœ๋…

    REST๋Š” ๋‹ค์Œ์˜ 6๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด์š”:

    1. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ

      • ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €, ์•ฑ)์™€ ์„œ๋ฒ„๋Š” ์„œ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์—ญํ• ์„ ๋‚˜๋ˆ”.
    2. ๋ฌด์ƒํƒœ์„ฑ (Stateless)

    Created Thu, 03 Apr 2025 18:02:29 +0900
  • @Mock๊ณผ @MockBean์€ ๋‘˜ ๋‹ค ํ…Œ์ŠคํŠธ์—์„œ Mock ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์ด์ง€๋งŒ, ์“ฐ์ด๋Š” ํ™˜๊ฒฝ๊ณผ ์—ญํ• ์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์š”. ๊ฐ„๋‹จํžˆ ์ฐจ์ด๋ถ€ํ„ฐ ์š”์•ฝํ•˜๋ฉด:


    ๐Ÿ”น @Mock (from Mockito)

    • Mockito์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
    • **์ˆœ์ˆ˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Test)**์— ์‚ฌ์šฉ
    • Spring Context์™€๋Š” ๋ฌด๊ด€
    • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋‚ด์—์„œ ์˜์กด์„ฑ์„ Mock์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ
    • MockitoAnnotations.openMocks(this) ๋˜๋Š” @ExtendWith(MockitoExtension.class) ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

    ์˜ˆ์‹œ:

    @ExtendWith(MockitoExtension.class)
    class MyServiceTest {
    
        @Mock
        private MyRepository myRepository;
    
        @InjectMocks
        private MyService myService;
    
        @Test
        void testSomething() {
            // myRepository๋Š” mock ๊ฐ์ฒด
        }
    }
    

    ๐Ÿ”ธ @MockBean (from Spring Boot)

    • Spring Boot Test์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
    • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ(Integration Test) ์‹œ ์‚ฌ์šฉ
    • Spring ApplicationContext์— ๋“ฑ๋ก๋œ Bean์„ Mock์œผ๋กœ ๊ต์ฒด
    • @SpringBootTest, @WebMvcTest, @DataJpaTest ๊ฐ™์€ Spring ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ

    ์˜ˆ์‹œ:

    Created Thu, 03 Apr 2025 15:57:29 +0900
  • @Mock ๊ณผ @InjectedMock

    @Mock๊ณผ @InjectMocks์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณผ๊ฒŒ์š”. ์ด ๋‘˜์€ ํ•จ๊ป˜ ์ž์ฃผ ์“ฐ์ด์ง€๋งŒ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•ด์š”.


    ๐Ÿ”น @Mock

    • Mockito์—์„œ ์ œ๊ณต
    • Mock ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์คŒ
    • ๋‹จ๋…์œผ๋กœ๋Š” ๊ทธ๋ƒฅ ๊ฐ€์งœ ๊ฐ์ฒด์ผ ๋ฟ, ์•„๋ฌด ๋ฐ๋„ ์ฃผ์ž…๋˜์ง€ ์•Š์Œ
    @Mock
    private MyRepository myRepository; // ๊ฐ€์งœ ๊ฐ์ฒด ์ƒ์„ฑ
    

    ๐Ÿ”ธ @InjectMocks

    • ์—ญ์‹œ Mockito์—์„œ ์ œ๊ณต
    • ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๊ฐ์ฒด(ํ…Œ์ŠคํŠธํ•  ํด๋ž˜์Šค)๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
      ๊ทธ ์•ˆ์— ์žˆ๋Š” ์˜์กด์„ฑ ํ•„๋“œ์— @Mock์œผ๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋“ค์„ ์ž๋™์œผ๋กœ ์ฃผ์ž…
    @InjectMocks
    private MyService myService; // MyService ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ๋‚ด๋ถ€์— ์žˆ๋Š” MyRepository ๋“ฑ์— @Mock ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…
    

    โœ… ๊ฐ„๋‹จ ์˜ˆ์‹œ

    @ExtendWith(MockitoExtension.class)
    class MyServiceTest {
    
        @Mock
        private MyRepository myRepository;
    
        @InjectMocks
        private MyService myService;
    
        @Test
        void testSomething() {
            // myService๋Š” ์‹ค์ œ ๊ฐ์ฒด
            // myRepository๋Š” mock ๊ฐ์ฒด
            // myService ๋‚ด๋ถ€์—์„œ myRepository๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ mock์ด ์ฃผ์ž…๋จ
        }
    }
    

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

    ์–ด๋…ธํ…Œ์ด์…˜ ์—ญํ• 
    @Mock ๊ฐ€์งœ(Mock) ๊ฐ์ฒด ์ƒ์„ฑ
    @InjectMocks ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , @Mock ๊ฐ์ฒด๋ฅผ ๊ทธ ์•ˆ์— ์ฃผ์ž…

    ์ฆ‰, @Mock์ด ๊ฐ€์งœ ๋ถ€ํ’ˆ์„ ๋งŒ๋“œ๋Š” ๊ฑฐ๊ณ ,
    @InjectMocks๋Š” ๊ทธ ๋ถ€ํ’ˆ์„ ์กฐ๋ฆฝํ•ด์„œ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑฐ์˜ˆ์š”.

    Created Thu, 03 Apr 2025 15:57:29 +0900