> [!Notice] > 이 λ¬Έμ„œλŠ” λ‹€λ₯Έ λ¬Έμ„œμ—μ„œ μš©μ–΄μ˜ μ •μ˜λ‚˜ λœ»μ„ λ§ν¬ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ λ¬Έμ„œμž…λ‹ˆλ‹€. ν•„μš”ν•  λ•Œλ§ˆλ‹€ μš©μ–΄λ₯Ό μΆ”κ°€ν–ˆκΈ° λ•Œλ¬Έμ— μš©μ–΄μ˜ μˆœμ„œλŠ” μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. ### `Persistence` μ˜μ†μ„±. ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜μ–΄λ„ 데이터가 사라지지 μ•ŠλŠ” νŠΉμ„±μ„ λœ»ν•œλ‹€. νŒŒμΌμ‹œμŠ€ν…œμ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 데이터가 이런 μ˜μ†μ„±μ„ κ°€μ§„λ‹€. 주둜 λ°μ΄ν„°λ² μ΄μŠ€ 데이터와 κ΄€λ ¨ν•˜μ—¬ μ˜μ†μ„±μ΄λΌλŠ” 단어λ₯Ό μ“°κΈ° λ•Œλ¬Έμ—, `Persistence` λΌλŠ” 단어λ₯Ό 'μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μ΄μ˜ 톡신'을 λœ»ν•˜λŠ” μš©λ„λ‘œ 쓰기도 ν•œλ‹€. 예λ₯Ό λ“€μ–΄ `javax.persistence` νŒ¨ν‚€μ§€λ‚˜ μ›Ή μ„œλ²„μ˜ `Persistence Layer` κ°€ κ·Έλ ‡λ‹€ ### `SQL Mapper` SQL 문을 객체와 λ§€ν•‘ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ 데이터에 μ ‘κ·Όν•˜λŠ” λ°©λ²•μœΌλ‘œ MyBatisλ‚˜ JdbcTemplateμ—μ„œ μ‚¬μš©λœλ‹€. ### `ORM` Object-Relational Mapping(객체-관계 λ§€ν•‘). 객체λ₯Ό κ΅¬ν˜„ν•œ 데이터(클래슀)와 RDBMS의 데이터(ν…Œμ΄λΈ”)λ₯Ό μ„œλ‘œ λ³€ν™˜ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° κΈ°μˆ μ΄λ‹€.[^1] 객체 κ°„μ˜ 관계λ₯Ό λ°”νƒ•μœΌλ‘œ μžλ™μœΌλ‘œ SQL문을 μƒμ„±ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ 응닡 결과둜 μžλ™μœΌλ‘œ 객체λ₯Ό μƒμ„±ν•˜κΈ° λ•Œλ¬Έμ— SQLλ¬Έ 없이 κ°„μ ‘μ μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‘°μž‘ν•  수 μžˆλ‹€. ### `ORM` vs `SQL Mapper` `SQL Mapper`λŠ” μž‘μ„±ν•œ SQL λ¬Έμž₯을 μ‹€ν–‰ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ 데이터λ₯Ό λ‹€λ£¨λŠ” 방법인데 λ°˜ν•΄, `ORM`은 객체와 (κ΄€κ³„ν˜•) λ°μ΄ν„°λ² μ΄μŠ€ 속 데이터와 객체λ₯Ό λ™κΈ°ν™”ν•˜λŠ” 방법을 μ‚¬μš©ν•œλ‹€. ### `Repository` μ—¬λŸ¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 같은 λ°μ΄ν„°λ‘œ μž‘μ—…ν•  수 μžˆλ„λ‘ ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ˜λ―Έν•œλ‹€. λ‹¨μˆœν•œ 데이터 뿐만 μ•„λ‹ˆλΌ 이λ₯Ό κ΄€λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨κ³Ό μœ μ € μΈν„°νŽ˜μ΄μŠ€κ°€ 같이 μ‘΄μž¬ν•œλ‹€. [^2] ### `OSI` ![[OSI 1.png]] λ„€νŠΈμ›Œν¬ 톡신이 μΌμ–΄λ‚˜λŠ” 과정을 7개의 κ³„μΈ΅μœΌλ‘œ λΆ„λ¦¬ν•œ 것. 톡신 κ³Όμ •μ—μ„œ 생긴 λ¬Έμ œκ°€ 물리적인 이유(물리 계측, 데이터 링크 계측)인지, μΈν„°λ„·μ˜ λ¬Έμ œμΈμ§€(λ„€νŠΈμ›Œν¬ 계측, IP), μ „μ†‘μ˜ λ¬Έμ œμΈμ§€(전솑 계측), μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ¬Έμ œμΈμ§€(μ„Έμ…˜, ν‘œν˜„, μ‘μš© 계측) κ΅¬λΆ„ν•˜κ³  문제 원인을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 생겼닀. [^3] ### `MVC νŒ¨ν„΄` μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ””μžμΈ νŒ¨ν„΄ 쀑 ν•˜λ‚˜. λ°μ΄ν„°μ˜ μ •μ˜μ™€ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹€λ£¨λŠ” Model, 데이터λ₯Ό λ³΄μ—¬μ£ΌλŠ” 방식과 μ‚¬μš©μžμ˜ μž…λ ₯ 방식을 λ‹€λ£¨λŠ” View, view 와 λͺ¨λΈ μ€‘κ°„μ—μ„œ λ‘˜μ„ μ œμ–΄ν•˜λŠ” Controller둜 λ‚˜λˆ„μ–΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬ν˜„ν•˜λŠ” 방법이닀.[^4] μ²˜μŒμ—λŠ” μžλ°” μ„œλΈ”λ ›κ³Ό JSP, JDBCλ₯Ό μ‚¬μš©ν•˜λŠ” μΌμ’…μ˜ λ…Έν•˜μš°λ‘œ μ•Œλ €μ‘ŒμœΌλ‚˜ 이후 λ””μžμΈ νŒ¨ν„΄μœΌλ‘œ 자리 μž‘μ•˜λ‹€. ### `EJB` ![[EJB.png]] Enterprise Java Beans. κΈ°μ—… ν™˜κ²½μ˜ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ μ„œλ²„ μΈ‘ μ»΄ν¬λ„ŒνŠΈ λͺ¨λΈ. EJBHome κ³Ό EJBObject, EntityBean을 μƒμ†ν•˜μ—¬ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” λ²ˆκ±°λ‘œμ›€κ³Ό OOP 원칙 쀑 μ˜μ‘΄κ΄€κ³„ μ—­μ „ 원칙을 μ§€ν‚€κΈ° μ–΄λ ΅λ‹€λŠ” 점 λ•Œλ¬Έμ— ν˜„μž¬λŠ” 잘 쓰이지 μ•ŠλŠ”λ‹€. ### `POJO` Plain Old Java Object, 였래된 λ°©μ‹μ˜ κ°„λ‹¨ν•œ μžλ°” 객체. νŠΉμ • κΈ°μˆ μ— μ’…μ†λ˜μ§€ μ•ŠλŠ” 순수 μžλ°” 객체둜, μŠ€ν”„λ§μ΄ 이 POJO 기반의 κ²½λŸ‰ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€. κ³Όκ±° 많이 μ“°μ˜€λ˜ [[IT μš©μ–΄ 정리 πŸ“•#EJB|EJB]] ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” `javax.ejb `νŒ¨ν‚€μ§€μ—μ„œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ±°λ‚˜ νŠΉμ • 클래슀λ₯Ό 상속받아 λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•΄μ•Ό ν–ˆλ‹€. 이둜 인해 개발자의 μ½”λ“œμ™€ ν”„λ ˆμž„μ›Œν¬μ˜ μ½”λ“œκ°€ 맀우 κ°•ν•˜κ²Œ κ²°ν•©λ˜μ–΄, 개발자의 μ½”λ“œκ°€ ν”„λ ˆμž„μ›Œν¬μ— μ˜μ‘΄ν•˜λŠ” λ¬Έμ œκ°€ μžˆμ—ˆλ‹€. POJOλŠ” 이에 λŒ€ν•œ λŒ€μ•ˆμœΌλ‘œ μ œμ‹œλœ 객체 섀계 λ°©μ‹μœΌλ‘œ νŠΉμ • ν”„λ ˆμž„μ›Œν¬μ™€ 상관 없이 μˆœμˆ˜ν•œ μžλ°” 클래슀처럼 κ΅¬ν˜„λœλ‹€. ### `AJAX` ![[Pasted image 20231107105849.png]] AsynchronousΒ JavaScript and XML, 비동기 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ XML. ν•„μš”ν•œ λ°μ΄ν„°λ§Œ μ„œλ²„μ— μš”μ²­ν•˜κ³  응닡 받은 λ°μ΄ν„°λ‘œ HTMLμ΄λ‚˜ CSSλ₯Ό μˆ˜μ •ν•˜λŠ” μ›Ή 개발 기법. ### `Connection pool` μ „ν˜•μ μΈ λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 방식은 λ“œλΌμ΄λ²„λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°λ˜λŠ” Connection 객체λ₯Ό μƒμ„±ν•˜λŠ” 방식이닀. 이런 방식은 μ†Œκ·œλͺ¨ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ¬Έμ œκ°€ μ—†μ§€λ§Œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 규λͺ¨κ°€ 컀질 수둝 λ“œλΌμ΄λ²„λ₯Ό λ‘œλ“œν•˜κ³  Connection 객체λ₯Ό μƒμ„±ν•˜λŠ”λ° λΆˆν•„μš”ν•œ μ‹œκ°„μ΄ μ“°μ΄κ²Œ λœλ‹€. 이λ₯Ό ν•΄κ²°ν•˜λŠ” 방법 쀑 ν•˜λ‚˜κ°€ `Connection pool`이닀. `Connection pool`λŠ” μ›Ή μ»¨ν…Œμ΄λ„ˆκ°€ 싀행될 λ•Œ Connection 객체λ₯Ό 미리 pool에 많이 생성해두고 이λ₯Ό μ‚¬μš©ν•  일이 생기면 잠깐 λŒ€μ—¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄이고 μ‹€ν–‰ μ‹œκ°„μ„ κ°œμ„ ν•œλ‹€. λŒ€μ‹  pool의 크기가 컀질 수둝 λ©”λͺ¨λ¦¬λ₯Ό 많이 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ μ ˆν•œ μ‚¬μ΄μ¦ˆ 쑰절이 ν•„μš”ν•˜λ‹€. ### `SPA` Single Page Applicaition, 단일 νŽ˜μ΄μ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜. M(Mutil)PA와 λ°˜λŒ€λ˜λŠ” λ°©μ‹μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀계 방식이닀. ### `Mounting` μ»΄ν¬λ„ŒνŠΈ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  μƒμ„±λœ Element 듀이 [[3. Virtual DOM|Virtual DOM]]에 μ‚½μž…λ˜κ³  μ‹€μ œ DOM에 μ—…λ°μ΄νŠΈλ˜κΈ° μ „κΉŒμ§€μ˜ κ³Όμ •. ### `API` Appilcation programming interface, 볡수의 λ…λ¦½λœ ν”„λ‘œκ·Έλž¨λ“€μ΄ μ„œλ‘œ μ†Œν†΅ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€. ### `μŠ€μΌ€μΌμ•„μ›ƒ` μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±μ„ 늘리기 μœ„ν•΄ λ‘œλ“œ λ°ΈλŸ°μ„œμ— μ—°κ²°λœ WAS μΈμŠ€ν„΄μŠ€ 숫자λ₯Ό 늘렀 전체 μ²˜λ¦¬λŸ‰μ„ λŠ˜λ¦¬λŠ” 것. ### `단일 μž₯μ•  지점` μ‹œμŠ€ν…œ ꡬ성 μš”μ†Œ μ€‘μ—μ„œ, λ™μž‘ν•˜μ§€ μ•ŠμœΌλ©΄ 전체 μ‹œμŠ€ν…œμ΄ μ€‘λ‹¨λ˜λŠ” μš”μ†Œ. 이런 문제λ₯Ό μΌμœΌν‚¬ 수 μžˆλŠ” μ€‘μš”ν•œ μ»΄ν¬λ„ŒνŠΈλŠ” 볡수둜 λ§Œλ“€μ–΄ 문제 λ°œμƒμ‹œ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈκ°€ λŒ€μ‹ ν•  수 μžˆλ„λ‘ 섀계해야 ν•œλ‹€. μ΄λ ‡κ²Œ 단일 μž₯μ•  지점 문제λ₯Ό μΌμœΌν‚€μ§€ μ•ŠλŠ” μ‹œμŠ€ν…œμ„ 결함 ν—ˆμš© μ‹œμŠ€ν…œμ΄λΌκ³  ν•œλ‹€. ### `직렬화` λ„€νŠΈμ›Œν¬ ν†΅μ‹ μœΌλ‘œ 데이터λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό μ›μ‹œ λ°”μ΄νŠΈ ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” 것. λ˜λŠ” μ’€ 더 μΆ”μƒν™”λœ κ°œλ…μœΌλ‘œ μ–΄λ–€ μ‹œμŠ€ν…œμ—μ„œ μ“°λŠ” 데이터λ₯Ό 톡신에 μ ν•©ν•œ 데이터 ν˜•νƒœλ‘œ λ³€ν™˜ν•˜λŠ” 것. ### `μžλ°” 빈` μžλ°” λΉˆμ€ λ‹€μŒ 쑰건을 λ§Œμ‘±ν•˜λŠ” μžλ°” ν΄λž˜μŠ€μ΄λ‹€. 1. κΈ°λ³Έ μƒμ„±μž 쑴재 2. getter/setter λ©”μ„œλ“œ 쑴재 3. `java.io.Serializable` κ΅¬ν˜„ ## Reference [^1]:https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping [^2]:https://en.wikipedia.org/wiki/Content_repository [^3]:https://shlee0882.tistory.com/110 [^4]:https://developer.mozilla.org/ko/docs/Glossary/MVC