λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
이둠/Study

[JAVA] 객체지ν–₯ 5λŒ€μ›μΉ™ / POJO JAVA

by 6161990 2021. 6. 3.

πŸ“Œ SRP Single Responsibility Principle 단일 μ±…μž„ 원칙

ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μΌμ—λ§Œ μ±…μž„μ§„λ‹€.

즉, 1개의 ν΄λž˜μŠ€μ— ν•˜λ‚˜μ˜ μ—­ν• λ§Œ κ°€μ Έμ•Όν•œλ‹€.

섀계쀑인 ν”„λ‘œκ·Έλž˜λ°μ— ν΄λž˜μŠ€κ°€ μ—¬λŸ¬κ°€μ§€ 역할을 가지고 μžˆλ‹€λ©΄ κ²€ν†  ν›„,

λΆˆν•„μš”ν•œ ν•„λ“œλ‚˜ λ©”μ†Œλ“œλ₯Ό μ œκ±°ν•΄μ•Όν•œλ‹€.

 

κΈ°λŠ₯이 λ„ˆλ¬΄ λ§Žμ€ FTP Client 클래슀

 

예λ₯Όλ“€μ–΄ FileReader(String str)둜 쓰이닀가 -> FileReader(File file)둜 λ§€κ°œλ³€μˆ˜ 객체λ₯Ό λ°”κΎΈλ©΄ 

μ™ΈλΆ€μ—μ„œ μ“°μ΄κ³ μžˆλ˜ FileReaderλŠ” λ³€κ²½μ΄λ˜μ—ˆκΈ°λ•Œλ¬Έμ—,

FTP Client와 FileReader λ˜ν•œ μˆ˜μ •ν•΄μ€˜μ•Όν•œλ‹€.

.

.

이 밖에도, FTP ClientλŠ” λ„ˆλ¬΄ λ§Žμ€ κΈ°λŠ₯을 가지고 μžˆλ‹€. 

각각을 λΆ„λ¦¬μ‹œν‚¬ ν•„μš”κ°€ μžˆλ‹€. 

 

 

 

Network Connection, File Writer, File Readerλ₯Ό 각각 λΆ„λ¦¬μ‹œν‚΄

 

κ·Έλ ‡κ²Œ 되면 λ‹€λ₯Έ μƒˆλ‘œμš΄ λͺ¨λ“ˆ (Local File Reader, HttpClient)이

μΆ”κ°€ 및 μˆ˜μ • λ˜λ”λΌλ„ 영ν–₯ 받지 μ•ŠκΈ° λ•Œλ¬Έμ— μœ μ§€λ³΄μˆ˜, μž¬ν™œμš©μ΄ μ‰¬μ›Œμ§„λ‹€.

 

 


 


πŸ“Œ OCP Open Closed Principle 개방 폐쇄 원칙(μ˜€ν”ˆ/ν΄λ‘œμ¦ˆμ›μΉ™)
μžμ‹ μ˜ ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³  μ£Όλ³€μ˜ λ³€ν™” λŒ€ν•΄μ„œλŠ” λ‹«ν˜€μžˆμ–΄μ•Όν•œλ‹€. 

μ œκ³΅λ˜λŠ” κΈ°λŠ₯은 ν™•μž₯ν•  수 μžˆμ§€λ§Œ(μ˜€ν”ˆ), μˆ˜μ •μ— 영ν–₯을 받지 μ•ŠλŠ” (폐쇄성)μž„μ„ κ³ λ €ν•œλ‹€.

 

λ‹€ν˜•μ„±μ„ 예둜,

μŠˆνΌν΄λž˜μŠ€μ™€ κ·Έ μ„œλΈŒ ν΄λž˜μŠ€κ°€ λ―Έλž˜μ— μ–΄λ–€ ν™•μž₯κ³Ό μˆ˜μ •λœ 방식(λ©”μ†Œλ“œ λ‚΄μš© λ³€κ²½ λ“±)을 해도 

μ‚¬μš©μž 츑은 κ·Έ μˆ˜μ •μ— λŒ€ν•΄ 영ν–₯을 받지 μ•Šμ•„μ•Ό ν•œλ‹€.

 

ν•˜μ§€λ§Œ, μˆ˜μ •μ΄ 생기면 그에 λ”°λ₯Έ λ³€ν™”λŠ” λ°˜λ“œμ‹œ 생긴닀.

이 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λ‚˜?

 

객체λ₯Ό μƒμ„±ν•˜κ³ , 연관관계λ₯Ό λ§Ίμ–΄μ£ΌλŠ” λ³„λ„μ˜ 쑰립, μ„€μ •μžκ°€ ν•„μš”ν•˜λ‹€.

μƒμœ„ν΄λž˜μŠ€ λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ€‘간에 λ‘ μœΌλ‘œμ¨, 

μžμ‹ μ€ λ³€ν™”에 λŒ€ν•΄μ„œλŠ” νμ‡„μ μ΄μ§€λ§Œ, μΈν„°νŽ˜μ΄μŠ€λŠ” μ™ΈλΆ€μ˜ λ³€ν™”에 λŒ€ν•΄μ„œ ν™•μž₯을 κ°œλ°©ν•΄μ€„ μˆ˜ μžˆλ‹€. 

 

λŒ€ν‘œμ μœΌλ‘œ JDBC와 Mybatis, Hibernate λ“± JAVAμ—μ„œλŠ” Streamμ—μ„œ μ°Ύμ•„λ³Ό 수 μžˆλ‹€.

JDBC μΈν„°νŽ˜μ΄μŠ€

 

 

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μž…μž₯μ—μ„œλŠ” μ™ΈλΆ€μ μœΌλ‘œ λ§Žμ€ Databaseκ°€ μžˆμ„ 수 μžˆλ‹€.

Databaseκ°€ λŠ˜μ–΄λ‚  수둝 계속 λ³€κ²½λ˜λŠ” 상황이 μžˆμ„ 수 μžˆλŠ”λ°, 

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ JDBC μΈν„°νŽ˜μ΄μŠ€κ°€ μžˆλ‹€. 

 

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€μ μœΌλ‘œλŠ” ν•œ ν•˜λ‚˜μ˜ ν†΅λ‘œμΈ JDBC μΈν„°νŽ˜μ΄μŠ€λ§Œμ„ 가지고 μžˆμ§€λ§Œ,

JDBC μΈν„°νŽ˜μ΄μŠ€ μ™ΈλΆ€μ μœΌλ‘œλŠ” N개 μ΄μƒμœΌλ‘œ ν™•μž₯ν•  수 μžˆλ‹€. 

 

 

 



πŸ“Œ LSP(Liskov Substitution Principle) λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜μ›μΉ™
μ„œλΈŒνƒ€μž…μ€ μ–Έμ œλ‚˜ μžμ‹ μ˜ κΈ°λ°˜(μƒμœ„) νƒ€μž…μœΌλ‘œ κ΅μ²΄ν•  μˆ˜ μžˆμ–΄μ•Όν•œλ‹€

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ€‘μš”ν•˜κ²Œ μ§€μΌœμ•Όν•  것은

μžμ‹ μ˜ μƒμœ„ νƒ€μž…(μΈν„°νŽ˜μ΄μŠ€)의 κ·œμ•½μ„ λ‹€ μ§€μΌœμ•Όν•œλ‹€λŠ” 점이닀.

λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ 원칙, μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄λŠ” λ―Ώκ³  μ‚¬μš©ν•˜λ €λ©΄, 이 원칙이 ν•„μš”ν•˜λ‹€.

λ‹¨μˆœν•œ 컴파일 패슀λ₯Ό λ„˜μ–΄μ„œλŠ” 이야기닀. 

예λ₯Όλ“€μ–΄, μžλ™μ°¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 엑셀을 μ•žμœΌλ‘œ κ°€λΌλŠ” κΈ°λŠ₯이닀. 

ν•˜μ§€λ§Œ 이 κΈ°λŠ₯을 ν•˜μœ„ν΄λž˜μŠ€μ—μ„œ λ’€λ‘œ κ°€κ²Œ κ΅¬ν˜„ν•˜λ©΄ LSPκ°€ μœ„λ°˜λœλ‹€. 

μ—‘μ…€ κΈ°λŠ₯은 λŠλ¦¬λ”λΌλ„ λ°˜λ“œμ‹œ μ•žμœΌλ‘œ κ°€μ•Όν•œλ‹€.

 

μΆ”κ°€ ) μƒμœ„λŠ” ν•˜μœ„λ₯Ό ν¬κ΄„ν•˜λŠ” 일반적 κ°œλ…μ„ 가지고 μžˆμ–΄μ•Ό ν•œλ‹€.

포유λ₯˜ - 인간 의 κ°œλ…μ—μ„œ 인간은 μ–Έμ œλ‚˜ 포유λ₯˜μ— μ†ν•˜λŠ” 것을 λ– μ˜¬λ¦¬λ©΄ λœλ‹€.

μŠˆνΌν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ κ°€λŠ₯ν•œ 것은 μ„œλΈŒν΄λž˜μŠ€λ‘œ λŒ€μ²΄ μž‘λ™μ΄ κ°€λŠ₯ν•œμ§€ κ³ λ €ν•΄μ•Όν•œλ‹€.

 




πŸ“Œ ISP (Interface Segregation Principle) μΈν„°νŽ˜μ΄μŠ€ 뢄리원칙
ν΄λΌμ΄μ–ΈνŠΈλŠ” μžμ‹ μ΄ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ— μ˜μ‘΄ κ΄€κ³„λ₯Ό λ§ΊμœΌλ©΄ μ•ˆλœλ‹€. 

ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œλ₯Ό κ°•μš”ν•΄μ„œλŠ” μ•ˆλœλ‹€λŠ” μ˜λ―Έμ΄λ‹€. μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ˜μ–΄ μžˆλŠ” 것은 κ΅¬ν˜„ν•˜λŠ” ν΄λž˜μŠ€μ—μ„œ λͺ¨λ‘ κ΅¬ν˜„ν•΄μ•Ό ν•˜λ©°, κ·Έ μ•ˆμ— μ•Œλ§žμ§€ μ•Šμ€ λ©”μ†Œλ“œκ°€ ν¬ν•¨λœ 경우, 섀계가 λ§κ°€μ§ˆ κ°€λŠ₯성이 μžˆλ‹€. 

ν”„λ‘œμ νŠΈ μš”ꡬ μ‚¬ν•­κ³Ό μ„€κ³„에 λ”°λΌμ„œ SRP(단일 μ±…μž„ μ›μΉ™) / ISP(μΈν„°νŽ˜μ΄μŠ€ λΆ„리원칙)λ₯Ό μ„ νƒν•œλ‹€.

 

μ§€λ„λΌλŠ” κ°μ²΄λŠ” μ—λŠ” λ„λ³΄μ•ˆλ‚΄, μžλ™μ°¨ μ „μš©κΈΈ μ•ˆλ‚΄, μžμ „κ±° μ „μš©κΈΈ μ•ˆλ‚΄, μ§€ν•˜μ²  λ…Έμ„  λ“±λ“± λ§Žμ€ κΈ°λŠ₯μ΄μžˆμ„ 수 μžˆλ‹€.

μ΄λ•Œ μ§€ν•˜μ²  μ–΄ν”Œμ„ λ§Œλ“€ λ•Œ, 지도λ₯Ό μƒμ†λ°›μœΌλ©΄ λ‹€λ₯Έ ν•„μš”μ—†λŠ” μžλ™μ°¨ μ „μš©κΈΈ μ•ˆλ‚΄κΉŒμ§€ κ΅¬ν˜„ν•΄μ•Όν•˜λŠ” λΆˆν•„μš”μ„±μ΄ 생긴닀. λ”°λΌμ„œ λ„λ³΄μ•ˆλ‚΄, μžλ™μ°¨ μ „μš©κΈΈ μ•ˆλ‚΄μ— λ”°λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 각각 λ§Œλ“€μžλŠ” 것이 μΈν„°νŽ˜μ΄μŠ€ 뢄리원칙이닀.

 

 




πŸ“Œ DIP (Dependency Inversion Principle)의쑴 μ—­μ „ 원칙
μžμ‹ λ³΄λ‹€ λ³€ν•˜κΈ° μ‰¬μš΄ κ²ƒμ— μ˜μ‘΄ν•˜μ§€ λ§μ•„μ•Όν•œλ‹€.

κΈ°λ³Έ 역할에 μ˜μ‘΄ν•΄μ•Όμ§€, ꡬ체화에 μ˜μ‘΄ν•˜λ©΄ μ•ˆλœλ‹€λŠ” 것이닀.

(슈퍼 ν΄λž˜μŠ€λŠ” μ„œλΈŒ ν΄λž˜μŠ€μ— μ˜μ‘΄ν•œλ‹€.)

 

μ‚¬λžŒμ€ μ˜·μ— μ˜μ‘΄ν•  수 μžˆλ‹€.

μ—¬μ„±μ˜·, λ΄„ 옷, λ‚¨μ„±μ˜·μ΄ μ•„λ‹ˆλΌ, '옷'에 μ˜μ‘΄ν•œλ‹€.

μžμ‹ λ³΄λ‹€ λ³€ν•˜κΈ° μ‰¬μš΄ 것에 μ˜μ‘΄ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ 쀑간에 interface둜 '옷' 객체λ₯Ό λΌμ›Œλ„£κΈ°.

 

μ΄λŠ” Open Closed Principle 개방 폐쇄 원칙과 λΉ„μŠ·ν•œ 원리이닀.

μ›λž˜ SOLID λŠ” 객체 지ν–₯ 4λŒ€ νŠΉμ„±μ— κΈ°λ°˜ν•¨μœΌλ‘œμ¨ μ„œλ‘œ μœ μ‚¬ν•œ λͺ¨μ–‘κ³Ό 의미λ₯Ό λ‹΄κ³Ό μžˆλ‹€.

 

 

객체 지ν–₯의 핡심은 λ‹€ν˜•μ„±μ΄λ‹€.

ν•˜μ§€λ§Œ λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” μ‰½κ²Œ λΆ€ν’ˆμ„ κ°ˆμ•„ λΌμš°λ“― κ°œλ°œν•  수 μ—†λ‹€.

κ΅¬ν˜„ 객체λ₯Ό λ³€κ²½ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ„ ν•¨κ»˜ λ³€κ²½λ˜λŠ” 상황이 μ˜¨λ‹€. 

λ‹€ν˜•μ„± λ§ŒμœΌλ‘œλŠ” OCP, DIPλ₯Ό 지킬 수 μ—†λ‹€. 

λ­”κ°€κ°€ 더 ν•„μš”ν•˜λ‹€λŠ” 말이닀. 

그게 뭘까. 

닡은 μŠ€ν”„λ§μ— μžˆλ‹€.

DI, μ˜μ‘΄μ„± μ£Όμž…μ΄λ‹€. 

 

μ–΄μ¨Œλ“ ,

μ–΄λ–€ 원칙이든 λ°”νƒ•μ—λŠ” "역할을 λͺ…ν™•νžˆ ν•΄μ•Όν•œλ‹€"λŠ” 생각은 ν•„μˆ˜λ‘œ κ°€μ Έμ•Ό ν•œλ‹€.


 

 

πŸ“Œ POJO JAVAλž€?

 


POJO(Plain Old Java Object)
μˆœμˆ˜ν•œ μžλ°” μ˜€λΈŒμ νŠΈλ₯Ό λœ»ν•œλ‹€. 


1. νŠΉμ • κ·œμ•½μ— μ’…μ†λ˜μ§€ μ•ŠλŠ”λ‹€. 

νŠΉμ • Library, Moduleμ—μ„œ μ •μ˜λœ ν΄λž˜μŠ€λ₯Ό μƒμ†λ°›μ•„μ„œ κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„도 λœλ‹€. 

POJOκ°€ λ˜κΈ° μœ„ν•΄μ„œλŠ” μ™ΈλΆ€μ˜ μ˜μ‘΄μ„±μ„ λ‘μ§€ μ•Šκ³ , μˆœμˆ˜ν•œ JAVA둜 κ΅¬μ„±μ΄ κ°€λŠ₯ν•΄μ•Όν•œλ‹€.


2. νŠΉμ • ν™˜κ²½μ— μ’…μ†λ˜μ§€ μ•ŠλŠ”λ‹€. 

만일 νŠΉμ • λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•˜λŠ” 뢀뢄에

μ™ΈλΆ€ 쒅속적인 HTTP REQUEST, SESSION λ“± POJOλ₯Ό μœ„λ°°ν•œ κ²ƒμœΌλ‘œ κ°„μ£Όν•œλ‹€.

λ˜ν•œ 많이 μ‚¬μš©ν•˜κ³ λŠ” μžˆμ§€λ§Œ @Annotation 기반으둜 μ„€μ •ν•˜λŠ” 뢀뢄도

μ—„μ—°νžˆλŠ” POJO라고 λ³Ό 순 μ—†λ‹€.

 

 

POJO Framework
Spring, Hibernate
ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜κΈ° μœ„ν•΄μ„œλŠ” 

μ‹œμŠ€ν…œμ˜ λ³΅μž‘함 , λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ˜ λ³΅μž‘함 λ“± λ‹€μ–‘ν•œ μ–΄λ €μ›€μ„ λ§žμ΄ν•˜κ²Œ λœλ‹€.
μœ„μ˜ λ‘ ν”„λ ˆμž„ μ›Œν¬λŠ” κ°μ²΄μ§€ν–₯적인 μ„€κ³„λ₯Ό ν•˜κ³  μžˆμœΌλ©°, λ˜ν•œ POJOλ₯Ό μ§€ν–₯ν•˜κ³  μžˆλ‹€.
κ·ΈλŸ¬λ―€λ‘œ κ°œλ°œμžκ°€ μ„œλΉ„μŠ€ λ‘œμ§μ— μ§‘μ€‘ν•˜κ³  μ΄λ₯Ό POJO둜 μ‰½κ²Œ κ°œλ°œ ν•  μˆ˜ μžˆλ„둝 μ§€μ›ν•˜κ³  μžˆλ‹€.

 

 

 

λ‹€μŒ μ§ˆλ¬Έλ“€μ„ 잘 κΈ°μ–΅ν•΄λ³΄μž.


μžμ‹ μ˜ μ½”λ“œμ— if/else , switchκ°€ λ‚œλ¬΄ν•˜κ³  μžˆμ§€μ•Šμ€κ°€?
μ±…μž„κ³Ό μ—­ν• μ΄ λ‹€λ₯Έ μ½”λ“œ ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— λ‹€ λ“€μ–΄κ°€ μžˆμ§€ μ•Šμ€κ°€?
μ ˆμ°¨μ§€ν–₯적으둜 ν•œκ°œμ˜ νŒŒμΌμ— λͺ¨λ“  μ½”λ“œλ₯Ό λ„£κ³  μžˆμ§€ μ•Šμ€κ°€?
λ‚΄κ°€ λ§Œλ“  κ°μ²΄κ°€ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œκ°€?