week 7 leekyunghee - GANGNAM-JAVA/JAVA-STUDY GitHub Wiki

JAVA

java์˜ non-static ๋ฉค๋ฒ„์™€ static ๋ฉค๋ฒ„์˜ ์ฐจ์ด

  • ์šฐ์„  ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด "์Šคํƒœํ‹ฑ ๋ฉค๋ฒ„"๋ณด๋‹ค๋Š” "์Šคํƒœํ‹ฑ"์œผ๋กœ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์Šคํƒœํ‹ฑ ๋ณ€์ˆ˜์™€ ๋Œ€๋น„๋˜๋Š” ์˜๋ฏธ๋กœ ํด๋ž˜์Šค์˜ ๋น„์Šคํƒœํ‹ฑ ๋ณ€์ˆ˜๋ฅผ "๋ฉค๋ฒ„ ๋ณ€์ˆ˜"๋ผ๊ณ ๋„ ๋ถ€๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž„.

  • ๋™์ผํ•œ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์— ์˜ํ•ด ๊ณต์œ ๋œ๋‹ค๋Š” ๊ฑด ๋‹ค์†Œ ๋ถ€์ •ํ™•ํ•œ ๋‚ด์šฉ์ž„.

  • ์ž๋ฐ”์—์„œ ์ •์ ์ธ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋Š” ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ํ•œ ๊ฐ™์€ ํด๋ž˜์Šค ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ.

๋ฐ˜๋ณต๋˜๋Š” ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ง€๋งŒ ์ด๋Š” ์Šคํƒœํ‹ฑ ์ž์ฒด์— ๋Œ€ํ•œ ์ดํ•ด๋ณด๋‹ค๋Š” ์ธ์Šคํ„ด์Šค์™€ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์•„์ง ๋ช…ํ™•ํ•˜๊ฒŒ ์žกํ˜€์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ ์–ด๋ ต๊ฒŒ ๋Š๊ปด์ง€๋Š” ๋‚ด์šฉ์ž„.

์ธ์Šคํ„ด์Šค์™€ ํด๋ž˜์Šค์˜ ๊ฐœ๋…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฉค๋ฒ„๋Š” ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)์— ์†ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์Šคํƒœํ‹ฑ์€ ํด๋ž˜์Šค ์ž์ฒด์— ์†ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ •์˜ํ•˜๋ฉด ๊ทธ ๊ฒƒ์œผ๋กœ ๋์ž„.

  • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ œ์•ฝ์€ ๊ตณ์ด ๋ฒ•์น™์ฒ˜๋Ÿผ ์™ธ์šธ ํ•„์š”๊ฐ€ ์—†๊ณ  ์˜ˆ์ปจ๋Œ€ ํŠน์ •ํ•œ ์‚ฌ๋žŒ(์ธ์Šคํ„ด์Šค/๊ฐ์ฒด)์„ ํ•œ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ "์ธ๊ฐ„(ํด๋ž˜์Šค)์˜ ๋‚˜์ด(์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜)๋Š” ์–ผ๋งˆ์ธ๊ฐ€" ๊ฐ™์€ ์งˆ๋ฌธ์„ ํ•˜๋Š” ๊ฒŒ ๋ง์ด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š”๋ฐ๋Š” ์•”๊ธฐ๊ฐ€ ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://okky.kr/article/730788?note=2007538

  1. ๊ฐ์ฒด๋ช….static_๋ฉค๋ฒ„๋ช…

  2. ํด๋ž˜์Šค๋ช….static_๋ฉค๋ฒ„๋ช…

์ถœ์ฒ˜: https://neos518.tistory.com/52 [As I've always been]

๋ฐ•์‹ฑ๊ณผ ์–ธ๋ฐ•์‹ฑ์— ๋Œ€ํ•ด ์„ค๋ช…

  • Primitive Type์˜ ๊ฐ’์„ Wrapper class๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๊ธฐ๋ณธ ํƒ€์ž… - ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ

์Šค๋ ˆ๋“œ ๋ณ„๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ฐธ์กฐ ํƒ€์ž… - String, List

์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•จ.

  • ์ธ์Šคํ„ด์Šค ์ด๋ฏ€๋กœ ํž™์— ์ €์žฅ๋˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๋™์‹œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋™๊ธฐํ™” ์ด์Šˆ๊ฐ€ ๋งŽ์€ ์ฐธ์กฐ ํƒ€์ž….
int data = 512;
Integer value = new Integer(data);    // @deprecated(since="9")
  • ์˜คํ†  ๋ฐ•์‹ฑ๊ณผ ์˜คํ†  ์–ธ๋ฐ•์‹ฑ ๋•๋ถ„์— ๊ธฐ๋ณธ ํƒ€์ž…๊ณผ ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…์„ ํŽธํ•˜๊ฒŒ ๊ตฌ๋ถ„์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐ•์‹ฑ ํƒ€์ž… ๋ณด๋‹ค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ผ

3๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Œ


SPRING

JPA vs Mybatis

  • SQL Mapper์™€ ORM์— ๋Œ€ํ•ด ๋จผ์ € ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.

SQL Mapper

SQL Mapper๋Š” ์ง์ ‘ SQL๋ฌธ์„ ์ž‘์„ฑํ•ด DB๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Mybatis๊ฐ€ SQL Mapper์— ํ•ด๋‹นํ•œ๋‹ค.

ORM (Object Relational Mapping)

DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋งคํ•‘์‹œ์ผœ ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ORM์„ ์‚ฌ์šฉํ•˜๋ฉด SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. JPA, Hibernate ๋“ฑ์ด ํ•ด๋‹นํ•œ๋‹ค.

Mybatis

  • Java์—์„œ๋Š” DB์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก JDBC๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • JDBC๋Š” ํ•™์Šต์ด ์‰ฌ์›Œ์„œ ์ฒ˜์Œ DB ์ ‘๊ทผ์„ ๋ฐฐ์šธ ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

  • ๊ทธ๋ ‡์ง€๋งŒ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค Connection์„ ์ƒ์„ฑํ•ด์ค˜์•ผ ํ•˜๊ณ , ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„ ์‹ค์ œ ๊ฐœ๋ฐœ์—๋Š” ์ž˜ ์•ˆ์“ฐ์ด๋Š” ๋Š๋‚Œ์ด๋‹ค.

  • ์ด JDBC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด Mybatis์ด๋‹ค.

  • SQL Mapper์— ํ•ด๋‹นํ•œ๋‹ค. JDBC๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ผ๋ถ€๋ฅผ ์ฝ”๋“œ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ ์„ค์ •์œผ๋กœ ๋งคํ•‘์„ ๋Œ€์‹  ํ•ด์ค€๋‹ค.

์žฅ์ 

  • ํ•™์Šต์ด ์‰ฝ๋‹ค.
  • ์†Œ์Šค์ฝ”๋“œ์™€ sql์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์ด ๋ฐ˜๋ณต๋œ๋‹ค.

JPA (Java Persistent API)

  • Java ORM ๊ธฐ์ˆ ์— ๋Œ€ํ•œ API ํ‘œ์ค€ ๋ช…์„ธ๋กœ, ์ด๊ฒƒ ๋˜ํ•œ Java์—์„œ ์ œ๊ณตํ•˜๋Š” API์ด๋‹ค.

  • ์‚ฌ์šฉํ•  ๋•Œ JPA, Spring Data JPA, Hibernate๋ฅผ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • JPA๋Š” ์ž๋ฐ” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ RDBMS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ •์˜ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹˜! -> ๊ตฌํ˜„์ด ์—†๋‹ค.

  • Spring Data JPA๋Š” JPA๋ฅผ ์“ฐ๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋“ˆ์ด๋‹ค.

  • JPA interface๋ฅผ ๊ตฌํ˜„ํ•ด Repository๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • Hibernate๋Š” JPA์˜ ๊ตฌํ˜„์ฒด์ด๋‹ค.

์žฅ์ 

  • CRUD ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • Entity์— ์†์„ฑ๋งŒ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ๊ฑด๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋‹จ์ 

  • ์ƒ๋Œ€์ ์œผ๋กœ ํ•™์Šต์ด ์–ด๋ ต๋‹ค.
  • ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ์–ด๋ ต๋‹ค๊ณ  ํ•œ๋‹ค.

Spring MVC vs WebFlux ๋น„๊ต

  • MVC๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์™€ ์„œ๋ธ”๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณต
  • Webflux๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, Netty, Undertow์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์ง€์›ํ•˜๋ฏ€๋กœ, HTTP์™€ Reactive Stream ๊ธฐ๋ฐ˜์œผ๋กœ ์›น ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

WebFlux

WebFlux ๋ชจ๋“ˆ์—๋Š” HTTP abstractions, Reactive Stream apdater, Reactive codes ๊ทธ๋ฆฌ๊ณ  non-blocking servlet api๋ฅผ ์ง€์›ํ•˜๋Š” core web api๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Œ

server-side WebFlux ์ƒ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋žจ ๋ชจ๋ธ๋กœ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • Annotated Controller : Spring MVC ๋ชจ๋ธ ๊ธฐ๋ฐ˜์˜ ๊ธฐ์กด spring-web ๋ชจ๋“ˆ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Functional Endpoints : Java 8 lambda style routing๊ณผ handling ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ฒผ์šด routing๊ธฐ๋Šฅ๊ณผ request ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๊ณ , callbackํ˜•ํƒœ๋กœ์จ ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค๋Š” ์ ์ด annotated controller๋ฐฉ์‹๊ณผ์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

Infra/์šด์˜

Join์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ๋‹ค ์„ค๋ช…

์ •๊ทœํ™”, ์—ญ์ •๊ทœํ™”๋Š” ๋ฌด์—‡์ธ์ง€?

[์•Œ์•„์•ผ ํ•  ๊ฐœ๋…]

  • ์‚ฝ์ž…์ด์ƒ (Insertion Anomaly), ๊ฐฑ์‹ ์ด์ƒ (Update Anomaly), ์‚ญ์ œ์ด์ƒ (Deletion Anomaly) ์„ค๋ช…
  • ํ•จ์ˆ˜์  ์ข…์†์„ฑ (Functional Dependency)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๊ทœํ™”๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ž˜๋ชป ์„ค๊ณ„ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ค‘๋ณต์œผ๋กœ ์ธํ•œ ๊ณต๊ฐ„๋‚ญ๋น„๋ฅผ ๋„˜์–ด ๋ถ€์ž‘์šฉ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ถ€์ž‘์šฉ์„ ์ด์ƒ(Anomaly) ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ ์ด์ƒ ํ˜„์ƒ์˜ ์ข…๋ฅ˜๋กœ ์‚ฝ์ž…์ด์ƒ, ๊ฐฑ์‹ ์ด์ƒ, ์‚ญ์ œ์ด์ƒ์ด ์žˆ๋‹ค.

์ •๊ทœํ™”

  • ์ •๊ทœํ™”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ(Consistency)์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ชจ๋ธ์˜ ์‘์ง‘๋„(Cohesion)์„ ๋†’์—ฌ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์— ๋” ๊ฐ€๊นŒ์›Œ์ง„๋‹ค.

์—ญ์ •๊ทœํ™”

  • ์—ญ์ •๊ทœํ™”๋Š” ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด ์ผ๋ถ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘๋ณต๋œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

JOIN ์ด๋ž€?

  • 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • ๋ณดํ†ต ๊ณตํ†ต๋œ ๊ฐ’์ธ PK ๋ฐ FK ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ์ธํ•œ๋‹ค.

  • ์กฐ์ธ์€ ์กฐ์ธ ์—ฐ์‚ฐ์ž์— ๋”ฐ๋ผ, From ์ ˆ์˜ ์กฐ์ธ ํ˜•ํƒœ์— ๋”ฐ๋ผ์„œ ๊ตฌ๋ณ„ํ•œ๋‹ค.

  • JOIN์˜ ๊ตฌ๋ณ„

โ–  ์—ฐ์‚ฐ์ž์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

  • EQUI JOIN : ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์นผ๋Ÿผ ๊ฐ’๋“ค์ด ์„œ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ( '=' ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ)

  • NON EQUI JOIN : ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์นผ๋Ÿผ ๊ฐ’๋“ค์ด ์„œ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ (๋น„๊ต ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ)

โ–  FROM ์ ˆ์˜ JOIN ํ˜•ํƒœ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

  • INNER JOIN : JOIN ์กฐ๊ฑด์—์„œ ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ ๋ฐ˜ํ™˜

  • OUTER JOIN : JOIN ์กฐ๊ฑด์—์„œ ํ•œ์ชฝ ๊ฐ’์ด ์—†๋”๋ผ๋„ ํ–‰์„ ๋ฐ˜ํ™˜