IT곡뢀일기
article thumbnail

πŸ” μŠ€ν”„λ§μ˜ λ“±μž₯

μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ : λŒ€κ·œλͺ¨μ˜ λ³΅μž‘ν•œ 데이터λ₯Ό κ΄€λ¦¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜

μ†Œν”„νŠΈμ›¨μ–΄ λΆ„μ•Όκ°€ λ°œμ „ν•˜λ©° μ΄λŠ” 점점 λ³΅μž‘ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

λ§Žμ€ μ‚¬μš©μžμ˜ μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ²„ μ„±λŠ₯κ³Ό μ•ˆμ •μ„±, λ³΄μ•ˆμ΄ 맀우 μ€‘μš”ν•œλ°

이런 것듀을 μ‹ κ²½μ“°λ©΄μ„œ μ‚¬μ΄νŠΈ κΈ°λŠ₯, 즉 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§κΉŒμ§€ κ°œλ°œν•˜κΈ°λŠ” 맀우 μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

 

? : λˆ„κ΅°κ°€ μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ 개발 ν™˜κ²½μ„ μ œκ³΅ν•΄μ„œ κΈ°λŠ₯ κ°œλ°œμ—λ§Œ 집쀑할 수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£Όλ©΄ μ–Όλ§ˆλ‚˜ μ’‹μ„κΉŒ

 

μ΄λ•Œ λ“±μž₯ν•œ 것이 μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬.

μ•žμ„œ μ–ΈκΈ‰ν•œ μ„œλ²„ μ„±λŠ₯, μ•ˆμ •μ„±, λ³΄μ•ˆμ„ 맀우 높은 μˆ˜μ€€μœΌλ‘œ μ œκ³΅ν•˜λŠ” 도ꡬ


πŸ” μŠ€ν”„λ§μ„ 더 μ‰½κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” μŠ€ν”„λ§ λΆ€νŠΈ

μŠ€ν”„λ§μ€ 섀정이 맀우 λ³΅μž‘ν•˜λ‹€λŠ” 인식을 ν™•μΈν•˜κ³  λ³΄μ™„ν•˜κ³ μž μΆœμ‹œν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λΉ λ₯΄κ²Œ μŠ€ν”„λ§ ν”„λ‘œμ νŠΈλ₯Ό μ„€μ •ν•˜κ³  μ˜μ‘΄μ„± μ„ΈνŠΈλΌκ³  λΆˆλ¦¬λŠ” μŠ€νƒ€ν„°λ₯Ό μ‚¬μš©, 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°œλ°œμžκ°€ 쑰금 더 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ°œλ°œμ—λ§Œ 집쀑할 수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£ΌλŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

 

μ£Όμš” νŠΉμ§•

 

- ν†°μΊ£, μ œν‹°, μ–Έλ”ν† μš° 같은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„(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 μ‹€ν–‰ 파일과 비ꡐ해 λ„€μ΄ν‹°λΈŒ 이미지λ₯Ό μ‚¬μš©ν•˜λ©΄ 가동 μ‹œκ°„μ΄ μ§§μ•„μ§€κ³  λ©”λͺ¨λ¦¬λ₯Ό 더 적게 μ†Œλͺ¨ν•©λ‹ˆλ‹€.