0912 ~ 0918


# 0912 ~ 0918

# 0913 - HTTP์˜ ์ง„ํ™” ๊ณผ์ •

  • HTTP/1.1: ASCII over TCP
  • HTTP/2: Binary Multiplexed over SPDY(TCP)
  • HTTP/3: Binary over Multiplexed QUIC(UDP)

# HTTP/1.1

  • ์—ฐ๊ฒฐ ์ƒํƒœ ์œ ์ง€
  • ํŒŒ์ดํ”„๋ผ์ด๋‹
  • HOLB ๋ฌธ์ œ
  • ํ—ค๋” ์ค‘๋ณต ๋ฌธ์ œ
  • HTTPS/RESTful API์˜ ํƒ„์ƒ

# HTTP/2

  • TCP ๊ธฐ๋ฐ˜์˜ SPDY ํ”„๋กœํ† ์ฝœ -> HTTPS ๊ฐ•์ œ
  • ์ด์ง„ ํ”„๋กœํ† ์ฝœ(๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋ ˆ์ด๋ฐ)
  • ์ŠคํŠธ๋ฆผ, ๋ฉ”์‹œ์ง€, ํ”„๋ ˆ์ž„์œผ๋กœ ๊ตฌ๋ถ„
  • ๋ฉ€ํ‹ฐํ”Œ๋ ‰์‹ฑ(์‘๋‹ต ๋‹ค์ค‘ํ™”) -> HOLB ๋ฌธ์ œ ํ•ด๊ฒฐ
  • HPACK -> ํ—ค๋” ์ค‘๋ณต ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ์„œ๋ฒ„ ํ‘ธ์‹œ
  • ์ŠคํŠธ๋ฆผ ๋ณ„ ์šฐ์„  ์ˆœ์œ„ ์„ค์ •
  • TCP ์ž์ฒด์˜ HOLB ๋ฌธ์ œ

# HTTP/3

  • UDP ๊ธฐ๋ฐ˜์˜ QUIC ํ”„๋กœํ† ์ฝœ
  • ๋…๋ฆฝ ์ŠคํŠธ๋ฆผ -> TCP HOLB ๋ฌธ์ œ ํ•ด๊ฒฐ
  • QPACK -> ํ—ค๋” ์••์ถ• ๋ฌธ์ œ ๊ฐœ์„ 
  • ์บ์‹ฑ์„ ์ด์šฉํ•œ ORTT
  • ์„œ๋ฒ„ ํ‘ธ์‹œ
  • ์ŠคํŠธ๋ฆผ ๋ณ„ ์šฐ์„  ์ˆœ์œ„
  • Connection ID ๊ธฐ๋ฐ˜
  • TLS -> HTTPS ๊ฐ•์ œ

# 0914 - ๋น„ํŠธ ์—ฐ์‚ฐ

# ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ(bitwise operation)

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

๊ทธ๋Ÿฌ๋‚˜ ์•„์ง๋„ ํ•˜๋“œ์›จ์–ด ๊ด€๋ จ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋‚˜ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋“ฑ ์ œํ•œ๋œ ์ž์›์„ ๊ฐ€์ง„ ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋น„ํŠธ ๋‹จ์œ„์˜ ์—ฐ์‚ฐ์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋น„ํŠธ ๋‹จ์œ„ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ค„์ด๊ฑฐ๋‚˜, ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋น„ํŠธ ์—ฐ์‚ฐ์ž

๋น„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ๋น„ํŠธ(bit) ๋‹จ์œ„๋กœ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์—ฐ์‚ฐ์ž์ด๋‹ค.
๋˜ํ•œ, ์™ผ์ชฝ์ด๋‚˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ „์ฒด ๋น„ํŠธ๋ฅผ ์ด๋™์‹œํ‚ฌ ๋•Œ์—๋„ ์‚ฌ์šฉํ•œ๋‹ค.

  • ~ : ๋น„ํŠธ๋ฅผ 1์ด๋ฉด 0์œผ๋กœ, 0์ด๋ฉด 1๋กœ ๋ฐ˜์ „์‹œํ‚ด. (๋น„ํŠธ NOT ์—ฐ์‚ฐ)
  • & : ๋Œ€์‘๋˜๋Š” ๋น„ํŠธ๊ฐ€ ๋ชจ๋‘ 1์ด๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•จ. (๋น„ํŠธ AND ์—ฐ์‚ฐ)
  • | : ๋Œ€์‘๋˜๋Š” ๋น„ํŠธ ์ค‘์—์„œ ํ•˜๋‚˜๋ผ๋„ 1์ด๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•จ. (๋น„ํŠธ OR ์—ฐ์‚ฐ)
  • ^ : ๋Œ€์‘๋˜๋Š” ๋น„ํŠธ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด 1์„ ๋ฐ˜ํ™˜ํ•จ. (๋น„ํŠธ XOR ์—ฐ์‚ฐ)
  • << : ์ง€์ •ํ•œ ์ˆ˜๋งŒํผ ๋น„ํŠธ๋“ค์„ ์ „๋ถ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ด. (left shift ์—ฐ์‚ฐ)
  • : ์ง€์ •ํ•œ ์ˆ˜๋งŒํผ ๋น„ํŠธ๋“ค์„ ์ „๋ถ€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™์‹œํ‚ด. (right shift ์—ฐ์‚ฐ)

# ๋น„ํŠธ์—ฐ์‚ฐ ๊ด€๋ จ ์šฉ์–ด

# ๋น„ํŠธ ํ•„๋“œ(bit field)

์ธ์ ‘ํ•œ ๋น„ํŠธ๋“ค์˜ ์—ฐ์†์ ์ธ ๊ณต๊ฐ„
ex)

  • char : 8bit(1byte) ๋น„ํŠธ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ์ž๋ฃŒํ˜•
  • int, float : 32bit(4byte) ๋น„ํŠธ ํ•„๋“œ๋ฅผ ๊ฐ–๋Š” ์ž๋ฃŒํ˜•

# ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ(bit flag)

๋น„ํŠธ ํ•„๋“œ์—์„œ ๋น„ํŠธ๋“ค์˜ ์ƒํƒœ๊ฐ’์„ ํ™•์ธ ํ•˜๊ธฐ ์œ„ํ•œ ํŠน์ • ๊ฐ’
(๊นƒ๋ฐœ์„ ํ†ตํ•ด ์–ด๋–ค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋“ฏ์ด, bit๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ƒํƒœ๋ฅผ ํ™•์ธ ํ•œ๋‹ค๋Š” ์˜๋ฏธ)
๋น„ํŠธ ํ”Œ๋ž˜๊ทธ๋Š” ํŠน์ • ์ƒํƒœ๊ฐ’์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๋น„ํŠธ๋ฅผ ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ ๋  ์ˆ˜ ์žˆ๋‹ค.
ํ”Œ๋ž˜๊ทธ(flag)๋ผ๊ณ ๋„ ํ•œ๋‹ค. ๊ตณ์ด ๊ตฌ๋ถ„ํ•˜์ž๋ฉด ์–ด๊ฐ์ƒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  • bit flag : ํŠน์ • ๋‹จ์ผ ๋น„ํŠธ ๊ฐ’์ด 1๋กœ ์„ธํŒ… ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • flag : 1๊ฐœ ์ด์ƒ์˜ bit๊ฐ’์ด 1๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, bit flag๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด flag๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋”ฐ.

# ๋น„ํŠธ๋งˆ์ŠคํŠธ(bit masking)

๋น„ํŠธ ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋˜๋Š” ํ”Œ๋ž˜๊ทธ
์ฆ‰, ํ”Œ๋ž˜๊ทธ์ธ๋ฐ ํŠน์ • ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋  ๋•Œ ๋งˆ์Šคํฌ๋ผ๊ณ ๋„ ํ•œ๋‹ค.
๋งˆ์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋น„ํŠธ ์—ฐ์‚ฌ์„ '๋น„ํŠธ ๋งˆ์Šคํ‚น'์ด๋ผ๊ณ  ํ•œ๋‹ค.
ํ™œ์šฉ ์˜ˆ ์ด๋ฏธ์ง€ ๋งˆ์Šคํ‚น, IP ์ฃผ์†Œ์˜ mask ๊ฐ’, ํ•ด์‹œ ํ…Œ์ด๋ธ”


# 0918 - ReflectionTestUtils๋ฅผ ํ†ตํ•œ private ๋ฉ”์†Œ๋“œ ํ…Œ์ŠคํŠธ

private ๋ฉ”์†Œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ ์œ ํ‹ธ
  2. ์ž๋ฐ” lang์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

# ReflectionTestUtils

ReflectionTestUtils is a collection of reflection-based utility methods. You can use these methods in testing scenarios where you need to change the value of a constant, set a non-public field, invoke a non-public setter method, or invoke a non-public configuration or lifecycle callback method when testing application code for use cases such as the following:

@Component
@Getter
public class ReflectionTestUtilsComponent {

    private int privateValue;

    private int privateMethod(int a, int b) {
        privateValue += a;
        privateValue += b;
        return privateValue;
    }
}
  • private ๋ณ€์ˆ˜ ์ฃผ์ž…
static void	setField(Class<?> targetClass, String name, Object value)

static void	setField(Class<?> targetClass, String name, Object value, Class<?> type)

static void	setField(Object targetObject, Class<?> targetClass, String name, Object value, Class<?> type)

static void	setField(Object targetObject, String name, Object value)

static void	setField(Object targetObject, String name, Object value, Class<?> type)
@Test
public void testPrivateValue() {
    ReflectionTestUtils.setField(reflectionTestUtilsComponent, "privateValue", 100);
    // ReflectionTestUtils.setField(๋Œ€์ƒ ๊ฐ์ฒด, "๋ณ€์ˆ˜๋ช…", ์›ํ•˜๋Š” ๊ฐ’);

    Assertions.assertEquals(100, reflectionTestUtilsComponent.getPrivateValue());
}
  • private ๋ฉ”์†Œ๋“œ ํ…Œ์ŠคํŠธ
static <T> T	invokeMethod(Class<?> targetClass, String name, Object... args)

static <T> T	invokeMethod(Object targetObject, Class<?> targetClass, String name, Object... args)

static <T> T	invokeMethod(Object target, String name, Object... args)
@Test
public void testPrivateMethod() {
    ReflectionTestUtils.setField(reflectionTestUtilsComponent, "privateValue", 100);
    // ReflectionTestUtils.setField(๋Œ€์ƒ ๊ฐ์ฒด, "๋ณ€์ˆ˜๋ช…", ์›ํ•˜๋Š” ๊ฐ’);

    Assertions.assertEquals(103, (Integer) ReflectionTestUtils.invokeMethod(reflectionTestUtilsComponent, "privateMethod", 1, 2));
    // ReflectionTestUtils.invokeMethod(๋Œ€์ƒ ๊ฐ์ฒด, "๋ฉ”์†Œ๋“œ(ํ•จ์ˆ˜)๋ช…", ์ธ์ž);

    Assertions.assertEquals(103, reflectionTestUtilsComponent.getPrivateValue());
}
Last update: September 18, 2022 22:56
Contributors: jaesungahn91 , ahnjs