π μ€νλ§μ λ±μ₯
μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ : λκ·λͺ¨μ 볡μ‘ν λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ μ ν리μΌμ΄μ
μννΈμ¨μ΄ λΆμΌκ° λ°μ νλ©° μ΄λ μ μ 볡μ‘ν΄μ‘μ΅λλ€.
λ§μ μ¬μ©μμ μμ²μ λμμ μ²λ¦¬ν΄μΌ νκΈ° λλ¬Έμ μλ² μ±λ₯κ³Ό μμ μ±, 보μμ΄ λ§€μ° μ€μνλ°
μ΄λ° κ²λ€μ μ κ²½μ°λ©΄μ μ¬μ΄νΈ κΈ°λ₯, μ¦ λΉμ¦λμ€ λ‘μ§κΉμ§ κ°λ°νκΈ°λ λ§€μ° μ΄λ ΅μ΅λλ€.
? : λκ΅°κ° μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ μ μν κ°λ° νκ²½μ μ 곡ν΄μ κΈ°λ₯ κ°λ°μλ§ μ§μ€ν μ μλλ‘ λ§λ€μ΄μ£Όλ©΄ μΌλ§λ μ’μκΉ
μ΄λ λ±μ₯ν κ²μ΄ μ€νλ§ νλ μμν¬.
μμ μΈκΈν μλ² μ±λ₯, μμ μ±, 보μμ λ§€μ° λμ μμ€μΌλ‘ μ 곡νλ λꡬ
π μ€νλ§μ λ μ½κ² λ§λ€μ΄μ£Όλ μ€νλ§ λΆνΈ
μ€νλ§μ μ€μ μ΄ λ§€μ° λ³΅μ‘νλ€λ μΈμμ νμΈνκ³ λ³΄μνκ³ μ μΆμνμμ΅λλ€.
λΉ λ₯΄κ² μ€νλ§ νλ‘μ νΈλ₯Ό μ€μ νκ³ μμ‘΄μ± μΈνΈλΌκ³ λΆλ¦¬λ μ€νν°λ₯Ό μ¬μ©, κ΄λ¦¬ν μ μμ΅λλ€.
κ°λ°μκ° μ‘°κΈ λ λΉμ¦λμ€ λ‘μ§ κ°λ°μλ§ μ§μ€ν μ μλλ‘ λ§λ€μ΄μ£Όλ λꡬμ λλ€.
μ£Όμ νΉμ§
- ν°μΊ£, μ ν°, μΈλν μ° κ°μ μΉ μ ν리μΌμ΄μ μλ²(web application server, WAS)κ° λ΄μ₯λμ΄ λ 립μ μΌλ‘ μ€νν μ μμ΅λλ€.
- λΉλ ꡬμ±μ λ¨μννλ μ€νλ§ λΆνΈ μ€νν°λ₯Ό μ 곡ν©λλ€.
- XML μ€μ μ νμ§ μκ³ μλ° μ½λλ‘ λͺ¨λ μμ±ν μ μμ΅λλ€.
- JARλ₯Ό μ΄μ©ν΄μ μλ° μ΅μ λ§μΌλ‘λ λ°°ν¬κ° κ°λ₯ν©λλ€.
- μ ν리μΌμ΄μ μ λͺ¨λν°λ§ λ° κ΄λ¦¬ λκ΅¬μΈ μ€νλ§ μ‘μΈμμ΄ν°(spring actuator)λ₯Ό μ 곡ν©λλ€.
π μ€νλ§κ³Ό μ€νλ§ λΆνΈμ μ°¨μ΄μ
| μ°¨μ΄μ | μ€νλ§ | μ€νλ§λΆνΈ |
| λͺ©μ | μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ κ°λ°μ λ μ½κ² λ§λ€κΈ° | μ€νλ§ κ°λ°μ λ λΉ λ₯΄κ² μ½κ² νκΈ° |
| μ€μ νμΌ | μλ | μλ |
| xml | μΌλΆ νμΌμ XMLλ‘ μ§μ μμ±νκ³ κ΄λ¦¬ | μ¬μ©νμ§ μμ |
| μΈλ©λͺ¨λ¦¬ λ°μ΄ν°λ² μ΄μ€ μ§μ | X | μλ μ€μ μ§μ |
| μλ² | λ³λλ‘ μλ μ€μ | λ΄μ₯ν μλ² μ 곡μΌλ‘ λ³λ μ€μ νμ μμ |
π μ€νλ§ μ½μ νΈ κ³΅λΆνκΈ°
β μ μ΄μ μμ IoCλ?
Inversion of Control μ½μλ‘, μΈλΆμμ κ΄λ¦¬νλ κ°μ²΄λ₯Ό κ°μ Έμ μ¬μ©νλ κ²μ λ§ν©λλ€.
public class A {
public B b; // μ½λμμ κ°μ²΄λ₯Ό μμ±νμ§ μκ³ μ΄λμ κ° λ°μμ¨ κ°μ²΄λ₯Ό bμ ν λΉ
}
μμΈν μ½λ
// μΌλ°μ μΈ μ½λ
public class A {
B b = new B();
}
// μ½λμμ κ°μ²΄λ₯Ό μμ±νμ§ μμ, μ΄λμ κ° λ°μμ¨ κ°μ²΄λ₯Ό bμ ν λΉ
public class IoC {
B b;
IoC(B b) {
this.b = b;
}
}
β DIλ?
Dependency Injection μ½μλ‘, μ μ΄μ μμ μ ꡬννκΈ° μν μμ‘΄μ± μ£Όμ λ°©λ²μ λλ€.
DIλ μ΄λ€ ν΄λμ€κ° λ€λ₯Έ ν΄λμ€μ μμ‘΄νλ€λ λ»μ λλ€.
public class A {
// Aμμ Bλ₯Ό μ£Όμ
λ°μ
@Autowired
B b;
}
@Autowired μ λν μ΄μ : μ€νλ§ μ»¨ν μ΄λμ μλ λΉμ μ£Όμ νλ μν
λΉμ΄λ μ€νλ§ μ»¨ν μ΄λμμ κ΄λ¦¬νλ κ°μ²΄λ₯Ό λ§ν©λλ€.
-> κΈ°μ‘΄ μλ° μ½λ : ν΄λμ€ Aμμ μ§μ B κ°μ²΄λ₯Ό μμ± νμ
-> μ€νλ§ : μ€νλ§ μ»¨ν μ΄λμμ κ°μ²΄λ₯Ό μ£Όμ λ°μ μ¬μ©ν¨.
π λΉκ³Ό μ€νλ§ μ»¨ν μ΄λ
β μ€νλ§ μ»¨ν μ΄λλ?
λΉμ μμ±νκ³ κ΄λ¦¬νλ μν .
μ¦, λΉμ΄ μμ±λκ³ μλ©ΈλκΈ°κΉμ§μ μλͺ μ£ΌκΈ°λ₯Ό κ΄λ¦¬ν΄μ€λλ€.
β λΉμ΄λ?
μ€νλ§ μ»¨ν μ΄λκ° μμ±νλ κ΄λ¦¬νλ κ°μ²΄μ λλ€.
μμμ λ³Έ μ½λμμ Bκ° λ°λ‘ λΉμ λλ€.
λΉμ λ±λ‘νλ λ°©λ²μλ XML νμΌ μ€μ , μ λν μ΄μ μΆκ° λ±μ΄ μμ΅λλ€.
ν΄λμ€λ₯Ό λΉμΌλ‘ λ±λ‘νλ λ°©λ²μλ @ComponentλΌλ μ λν μ΄μ μ λΆμ΄λ©΄ λ©λλ€.
@Component // ν΄λμ€ MyBeanμ λΉμΌλ‘ λ±λ‘
public class MyBean {
}
μ΄λ λΉμ μ΄λ¦μ ν΄λμ€ μ΄λ¦μ 첫 κΈμλ₯Ό μλ¬Έμλ‘ λ°κΏ κ΄λ¦¬ν©λλ€.
MyBeanκ³Ό κ°μ κ²½μ°μλ λΉμ λ³λ μ΄λ¦μ μ§μ νμ§ μμ μ myBeanμΌλ‘ μ§μ λ©λλ€.
(λΉμ μ‘°ννλ μ½λμμ MyBeanμΌλ‘ λΆλ¬μ¬ κ²½μ° μ€λ₯κ° λ©λλ€.)
π κ΄μ μ§ν₯ νλ‘κ·Έλλ°
AOPλ₯Ό μ½μλ‘, Aspect Oriented Programmingλ₯Ό κ΄μ μ§ν₯ νλ‘κ·Έλλ°μ΄λΌκ³ ν©λλ€.
νλ‘κ·Έλλ°μ λν κ΄μ¬μ ν΅μ¬ κ΄μ , λΆκ° κ΄μ μΌλ‘ λλμ΄μ κ΄μ¬ κΈ°μ€μΌλ‘ λͺ¨λννλ κ²μ μλ―Έν©λλ€.
κ³μ’ μ΄μ²΄, κ³ κ° κ΄λ¦¬νλ νλ‘κ·Έλ¨μ μμλ‘ λ€μ΄ μ€λͺ ν΄λ³΄κ² μ΅λλ€.
κ° νλ‘κ·Έλ¨μ μΌμ κΈ°λ‘νκΈ° μν λ‘μ§κ³Ό μ¬λ¬ λ°μ΄ν°λ₯Ό κ΄λ¦¬νκΈ° μν λ°μ΄ν°λ² μ΄μ€λ₯Ό μ°κ²°ν΄μΌ ν©λλ€.
μ΄λ ν΅μ¬ κ΄μ μ κ³μ’ μ΄μ²΄, κ³ κ° κ΄λ¦¬κ° μκ³
λΆκ° κ΄μ μλ λ‘κΉ κ³Ό λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ΄ μμ΅λλ€.
μμ μ μλ‘ ν΄λΉ μμλ₯Ό λ£μ΄λ³ΌκΉμ?
λΆκ° κ΄μ μ ν΄λΉνλ λ‘μ§μ λͺ¨λνν΄μ μ΄λ₯Ό ν΅μ¬ κ΄μ μ½λμμ λΆλ¦¬ν μ μκ² ν΄μ€λλ€.
λΆλ¦¬ν¨μΌλ‘μ¨ ν΅μ¬ κ΄μ μ½λμλ§ μ§μ€ν μ μκ² λμκ³ νλ‘κ·Έλ¨μ λ³κ²½, νμ₯μλ μ μ°νκ² λμν μ μκ² λ©λλ€.
π μ΄μ κ°λ₯ν μλΉμ€ μΆμν
PSAλ₯Ό μ½μλ‘, Portable Service Abstractionμ μ΄μ κ°λ₯ν μλΉμ€ μΆμνλΌκ³ ν©λλ€.
μ€νλ§μμ μ 곡νλ λ€μν κΈ°μ λ€μ μΆμνν΄ κ°λ°μκ° μ½κ² μ¬μ©νλ μΈν°νμ΄μ€λ₯Ό λ§ν©λλ€.
μλ₯Ό λ€μ΄ μ€νλ§μμ λ°μ΄ν°λ² μ΄μ€μ μ κ·ΌνκΈ° μν κΈ°μ λ‘λ JPA, MyBatis, JDBCκ° μμ΅λλ€.
μ¬κΈ°μ μ΄λ€ κΈ°μ μ μ¬μ©νλ μΌκ΄λ λ°©μμΌλ‘ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνλλ‘ μΈν°νμ΄μ€λ₯Ό μ§μν©λλ€.
λ λ€λ₯Έ μμλ‘ WASλ μμ΅λλ€.
μ½λλ κ·Έλλ‘ λκ³ WASλ₯Ό ν°μΊ£μ΄ μλ μΈλν μ°, λ€ν°μ κ°μ λ€λ₯Έ κ³³μμ μ€νν΄λ κΈ°μ‘΄ μ½λλ₯Ό κ·Έλλ‘ μ¬μ©ν μ μμ΅λλ€.
π μλ° 17λ²μ
β """ μ¬λ¬μ€ ν μ€νΈ νν
// κΈ°μ‘΄
String query11 = "SELECT * FROM item" +
"Hello" +
"World";
// λ°λ λ΄μ©
String query17 = """
Select * FROM item
Hello
World
""";
β formatted() λ©μλ
String textblock17 = """
{
"id": %d,
"name": %s
}
""".formatted(2, "juice");
ν΄λΉ κ²°κ³Όλ
%dμ 2κ° λ£μ΄μ§κ³
%sμ juice κ°μ΄ λ€μ΄κ°μ§κ² λ©λλ€.
β λ μ½λ
λ°μ΄ν° μ λ¬μ λͺ©μ μΌλ‘ νλ κ°μ²΄λ₯Ό λ λΉ λ₯΄κ³ κ°νΈνκ² λ§λ€κΈ° μν κΈ°λ₯
μμν μ μκ³ , νλΌλ―Έν°μ μ μν νλλ private finalλ‘ μ μλ©λλ€.
privateμ΄λΌμ getterλ₯Ό λ§λ€μ΄μ€μΌ νμ§λ§ λ μ½λμμλ μλμΌλ‘ λ§λ€κΈ° λλ¬Έμ λ°λ‘ μ μνμ§ μμλ λ©λλ€.
recode Item(String name, int price) {
// νλΌλ―Έν° : private finalλ‘ μ μ
}
Item juice = new Item("juice", 3000);
juice.price(); // 3000
β ν¨ν΄ λ§€μΉ
νμ νμΈμ μν instanceof + νλ³νμμ λ€μκ³Ό κ°μ΄ λ³κ²½λμμ΅λλ€.
// 11λ²μ
if (o instanceof Integer) {
Integer i = (Integer) o;
}
// 17λ²μ
if(o instanceof Integer i) {
}
β μλ£νμ λ§λ case μ²λ¦¬
static double getIntegerValue(Object o) {
return switch(o) {
case Double d -> d.intValue();
case Float f -> f.intValue();
case String s -> Integer.parseInt(s);
default -> 0d;
};
}
π Servlet, JPAμ λ€μ μ€νμ΄μ€ λ³κ²½
ν¨ν€μ§ λ€μ μ€νμ΄μ€κ° javax.* -> jakarta.*
(λ§μ½ μ€νλ§ λΆνΈ2 λ²μ μ΄λΌλ©΄ ν¨ν€μ§ μ΄λ¦μ jakartaλ‘ λ³κ²½ν΄μΌ ν©λλ€)
π GraalVM κΈ°λ°μ μ€νλ§ λ€μ΄ν°λΈ 곡μ μ§μ
μ€νλ§ μ ν리μΌμ΄μ μ λ€μ΄ν°λΈ μ΄λ―Έμ§λ‘ μ»΄νμΌν΄ JVMμ ꡬλλλ μ ν리μΌμ΄μ μ λΉν΄
μμ μκ°, λ©λͺ¨λ¦¬ μ€λ² ν€λλ₯Ό μ€μΌ μ μμ΅λλ€.
JVM μ€ν νμΌκ³Ό λΉκ΅ν΄ λ€μ΄ν°λΈ μ΄λ―Έμ§λ₯Ό μ¬μ©νλ©΄ κ°λ μκ°μ΄ μ§§μμ§κ³ λ©λͺ¨λ¦¬λ₯Ό λ μ κ² μλͺ¨ν©λλ€.
