week1 - violet-mj/be-was-2024 GitHub Wiki

index.html ๋ฐ˜ํ™˜ ํ•˜๊ธฐ

  • java Concurrent
    • ๊ธฐ์กด Java Thread ๋ชจ๋ธ
      • ์Šค๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ์ƒ์„ฑํ•˜๊ณ  ์ œ๊ฑฐํ•œ๋‹ค.
      • ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์€ ๋งค์šฐ ํฌ๋‹ค.
    • Concurrent ํŒจํ‚ค์ง€
      • ์Šค๋ ˆ๋“œ ํ’€์„ ๋งŒ๋“ค์–ด ์Šค๋ ˆ๋“œ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
      • ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋†“๊ณ  ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ, ์ œ๊ฑฐ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š์Œ
    • ์ž๋ฐ”์˜ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ
      • ์ž๋ฐ”๋Š” os thread์™€ platform thread(java์—์„œ ๋งŒ๋“  ์Šค๋ ˆ๋“œ)๊ฐ€ ์ผ๋Œ€์ผ๋กœ ๋งค์นญ๋œ๋‹ค.
      • ์ด๋Š” os๊ฐ€ thread๋ฅผ ์Šค์ผ€์ฅด๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ด ๋‚ฎ๋‹ค.
        • os ์Šค๋ ˆ๋“œ๋Š” ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ์œ ์ง€ ๋น„์šฉ์ด ๋น„์‹ธ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ด ์ข‹์ง€ ์•Š์Œ
        • ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ์ด ๋น„์‹ธ๋‹ค.
    • virtual thread
      • JVM์œ„์—์„œ ์Šค์ผ€์ฅด๋ง ๋˜๋Š” ๊ฒฝ๋Ÿ‰ํ™” ์Šค๋ ˆ๋“œ๋ฅผ ๋งํ•จ.
      • Virtual Thread๋Š” flatform thread ์•ˆ์—์„œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ํ•˜๋ฏ€๋กœ ๋งค์šฐ ๋น ๋ฅด๋‹ค.
  • BufferedInputStream
    • InputStream์€ ๋ณดํ†ต 1Byte์”ฉ ์ฝ๋Š”๋‹ค.
    • ์ด๋Ÿฐ ๊ณผ์ •์ด ๋ฐ˜๋ณต๋˜๋ฉด ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Buffer๋ฅผ ๋งŒ๋“ค์–ด ์ค‘๊ฐ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์•„์„œ ๋ณด๋‚ด๋„๋ก ํ•˜์ž.

2. ๋‹ค์–‘ํ•œ MimeType ์ง€์›ํ•˜๊ธฐ

ํ™•์žฅ์ž์—์„œ MimeType์œผ๋กœ ๋ณ€ํ™˜

  1. ์šฐ์„  ๊ฒฝ๋กœ์—์„œ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค.
public class PathParser {
    public String fileExtExtract(String fileName) {
        int pointPos = fileName.lastIndexOf(".");
        if(pointPos == -1) {
           throw new IllegalArgumentException("ํŒŒ์ผ ํ™•์žฅ์ž๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.");
        }
        return fileName.substring(pointPos);
    }
}
  1. HashMap์„ ์ด์šฉํ•˜์—ฌ ํŒŒ์ผ ์ด๋ฆ„๊ณผ MimeType์„ ๋งคํ•‘ํ•˜์˜€๋‹ค.
public class MimeTypeMapper {
    private Map<String, MimeType> mimeTypeMapper;

    public MimeTypeMapper() {
        mimeTypeMapper = new HashMap<>() {{
            put(".html", MimeType.HTML);
            put(".css", MimeType.CSS);
            put(".js", MimeType.JAVASCRIPT);
            put(".svg", MimeType.SVG);
            put(".ico", MimeType.ICO);
            put(".png", MimeType.PNG);
            put(".jpg", MimeType.JPG);
        }};
    }

    public MimeType getMimeType(String ext) {
        if(mimeTypeMapper.containsKey(ext)) {
            return mimeTypeMapper.get(ext);
        }
        throw new IllegalArgumentException("ํ™•์žฅ์ž์™€ ๋งคํ•‘๋˜๋Š” mimeType์ด ์—†์Šต๋‹ˆ๋‹ค.");
    }
}
  1. response์˜ content-type ํ—ค๋”์— MimeType์„ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
dos.writeBytes("Content-Type: " + mimeType + "\r\n");
  • ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
    1. Enum์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ
      • MimeType์„ ์›์‹œ ๊ฐ’์œผ๋กœ ๋‚˜๋‘๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ€์ˆ˜๋กœ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค.
      • ๋ชจ๋“  MimeType์„ ์ˆœํšŒํ•ด์•ผ ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ
    2. HashMap์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ
      • ํ•ด์‹ฑ์„ ํ•˜๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
    3. switch๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ธฐ
      • ์ง€์›ํ•˜๋Š” Content-Type ์ด ๋Š˜์–ด๋‚œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌ

MimeType

  • ๋ฏธ๋””์–ด ํƒ€์ž…์ด๋ž€ ๋ฌธ์„œ, ํŒŒ์ผ ๋˜๋Š” ๋ฐ”์ดํŠธ ์ง‘ํ•ฉ์˜ ์„ฑ๊ฒฉ๊ณผ ํ˜•์‹
  • type/subtype ์ฒ˜๋Ÿผ ์Šฌ๋ž˜์‹œ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • type: ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์†ํ•˜๋Š” ์ผ๋ฐ˜ ์นดํ…Œ๊ณ ๋ฆฌ
    • subtype: ์ •ํ™•ํ•œ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ
  • type/subtype;parameter=value ์ฒ˜๋Ÿผ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • charset : ๋ฌธ์ž์— ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž ์„ธํŠธ
    • q : client๊ฐ€ ์„ ํ˜ธํ•˜๋Š” mimeType์˜ ์šฐ์„ ์ˆœ์œ„

Accept Header

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์ปจํ…์ธ  ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ์ฝ˜ํ…์ธ  ํ˜‘์ƒ์„ ํ†ตํ•ด, ์„œ๋ฒ„๋Š” ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉฐ Content-Type ์‘๋‹ต ํ—ค๋”๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์„ ํƒ๋œ ํƒ€์ž…์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
    • ์ฝ˜ํ…์ธ  ํ˜‘์ƒ
      • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ ํ•ฉํ•œ ์ž์›์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ
      • ํด๋ผ์ด์–ธํŠธ์™€ ํ•จ๊ป˜ ์„œ๋กœ์˜ ์ž…์žฅ ์ฐจ์ด๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉฐ ๊ฑฐ๋ž˜ํ•  ์ž์›์„ ๊ฒฐ์ •ํ•œ๋‹ค.

Content-Type

  • ๋ฆฌ์†Œ์Šค์˜ media type์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜ํ™˜๋œ ์ปจํ…์ธ ์˜ ์ปจํ…์ธ  ์œ ํ˜•์ด ์‹ค์ œ๋กœ ๋ฌด์—‡์ธ์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Enum Map vs Hash Map

  • HashMap

    • ํ•ด์‹ฑ์„ ํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์œผ๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์ด ์กด์žฌ
    • ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •์—์„œ ์„ฑ๋Šฅ์ด ์ €ํ•˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • EnumMap

    • ๋‚ด๋ถ€์ ์œผ๋กœ Array๋ฅผ ์‚ฌ์šฉํ•จ.
      • enum์„ ์„ ์–ธํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ
      • oridinal()์„ ์ด์šฉํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
    • get ํ•จ์ˆ˜
      • ๋ฐฐ์—ด์„ ํ†ตํ•ด ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
        public V get(Object key) {
            return (isValidKey(key) ?
                    unmaskNull(vals[((Enum)key).ordinal()]) : null);
        }
    
  • Http์˜ Accept ์™€ Content-Type์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๋Š” ์‹œ๊ฐ„์ด ๋˜์—ˆ๋‹ค.

  • ํ™•์žฅ์ž์™€ MimeType์„ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋‹ค๋ฅธ ๋ถ„๋“ค๊ณผ ๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ๊ตฌํ˜„์„ ๋ณด๊ณ  ์–ด๋–ค ์žฅ๋‹จ์ ์ด ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค.

  • HashMap ๊ณผ EnumMap ๋ฅผ ๋น„๊ตํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

GET์œผ๋กœ ํšŒ์›๊ฐ€์ž…

  • Request ์ƒ์„ฑ์ž์•ˆ์— ๋ณต์žกํ•œ ๋กœ์ง์„ ๋„ฃ์ง€ ๋ง์ž
  • unit test๋Š” ์ž์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์ž
  • ํšŒ์› ๊ฐ€์ž… ๋กœ์ง ์ž‘์„ฑ ์‹œ 302 HttpCode ๋ฐ˜ํ™˜
  • redirect ๋ฐ˜ํ™˜ ์‹œ location ํ—ค๋” ์ถ”๊ฐ€ ํ•„์š”

ํ”ผ๋“œ๋ฐฑ

  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” ์ •ํ™•ํ•˜๊ณ  ์ƒ์„ธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์ž
  • ๋ณ€์ˆ˜ ์ด๋ฆ„์€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž˜ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ •ํ•˜์ž.
  • .gitignore ์ž‘์„ฑํ•˜์ž.
    • .idea, gradle/wrapper์™€ ๊ฐ™์€ ํŒŒ์ผ์€ git์—์„œ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†๋‹ค.
  • System.out.println์„ ์ฝ”๋“œ์•ˆ์— ๋„ฃ์ง€ ๋ง์ž.
  • HTTP ํ‘œ์ค€ ๋ฌธ์„œ(RFC)๋ฅผ ์ž˜ ์‚ดํŽด๋ณด์ž.
    • Header๋Š” ํ•ญ์ƒ ๊ณต๋ฐฑ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ": " ์•„๋‹Œ ":"์œผ๋กœ๋„ response๋Š” ์ž˜ ์ž‘๋™ํ•œ๋‹ค.
  • unit test๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์„ ์ตœ๋Œ€ํ•œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฒฌ๊ณ ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๋ผ
  • String์ด ์•„๋‹Œ ์ƒ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•˜์ž. ์‚ฌ๋žŒ์€ ์™„๋ฒฝํ•˜์ง€ ์•Š๋‹ค.
  • logger๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์ž.