λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Java

[ Java ] EJB와 POJO ν”„λ‘œκ·Έλž˜λ°

728x90
λ°˜μ‘ν˜•

πŸ’‘ EJB(Enterprise Java Bean)와 POJO ν”„λ‘œκ·Έλž˜λ°

[ POJO의 λ“±μž₯ ]

EJBλž€ μ—”ν„°ν”„λΌμ΄μ¦ˆ κ°œλ°œμ„ λ‹¨μˆœν™”ν•˜κΈ° μœ„ν•΄ 썬 μ‚¬μ—μ„œ λ§Œλ“  Java μŠ€νŽ™μ΄λ‹€. μŠ€ν”„λ§μ΄ λ“±μž₯ν•˜κΈ° μ΄μ „μ—λŠ” EJBκ°€ 독점을 ν•˜κ³  μžˆμ—ˆκΈ° λ•Œλ¬Έμ— μ½”λ“œλ“€μ΄ EJB κΈ°μˆ μ— μ§€λ‚˜μΉ˜κ²Œ μ’…μ†λ˜μžˆμ—ˆλ‹€. 

import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class OrdersService implements SessionBean {

    private SessionContext ctx;

    public Orders placeOrder(String menuName) {
        Orders orders = new Orders(menuName);
        orders.init()
        return orders;
    }

    @Override
    public void setSessionContext(SessionContext ctx) throws EJBException {
        this.ctx = ctx;
    }

    @Override
    public void ejbRemove() throws EJBException {

    }

    @Override
    public void ejbActivate() throws EJBException {

    }

    @Override
    public void ejbPassivate() throws EJBException {

    }
}
좜처: https://mangkyu.tistory.com/281 [MangKyu's Diary:ν‹°μŠ€ν† λ¦¬]

μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ λ³€μˆ˜λΆ€ν„° μ˜ˆμ™Έμ²˜λ¦¬, μƒμ†κΉŒμ§€ EJB에 μ˜μ‘΄μ μ΄λ‹€.

 

➑️ λ‹Ήμ‹œ λ§ˆν‹΄ νŒŒμšΈλŸ¬λŠ” μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ³΅μž‘ν•˜κ³  μ œν•œμ μΈ κΈ°μˆ λ³΄λ‹€ μžλ°”μ˜ λ‹¨μˆœ 였브젝트λ₯Ό μ΄μš©ν•΄ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 편이 λ‚«λ‹€κ³  μƒκ°ν•˜μ—¬ POJO(Plain Old Java Object)λ₯Ό λ§Œλ“€μ—ˆλ‹€.

 

⁉️ POJO : κ°„λ‹¨ν•œ 였래된 μžλ°” 였브젝트, 즉 λ‹€λ₯Έ ν™˜κ²½μ— μ’…μ†λ˜μ§€ μ•Šκ³  ν•„μš”μ— 따라 μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œ μžλ°” 였브젝트

PSA(Portable Service Abstraction) νœ΄λŒ€μš© μ„œλΉ„μŠ€ 좔상화

μ„œλΉ„μŠ€ μΆ”μƒν™”λž€ μ„œλΉ„μŠ€μ˜ λ‚΄μš©μ„ λͺ¨λ₯΄λ”라도 ν•΄λ‹Ή μ„œλΉ„μŠ€λ₯Ό μ΄μš©ν•  수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•œλ§ˆλ””λ‘œ νœ΄λŒ€μš© μ„œλΉ„μŠ€ μΆ”μƒν™”λŠ” 가볍고 μž‘μ€ 즉, ꡐ체가 μ‰½λ‹€λŠ” 말일 수 μžˆκ² λ‹€.

πŸ‘πŸ» λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 μˆ˜μ •μ—†μ΄ μ–Έμ œλ“ μ§€ λ³€κ²½ν•  수 μžˆλ‹€λŠ” 말이닀.

 

πŸ€” PSAλ₯Ό μ™œ μ‚¬μš©ν• κΉŒ?

  • μ„œλΉ„μŠ€λ₯Ό μΆ”μƒν™”ν•¨μœΌλ‘œμ¨ κ°œλ°œμžκ°€ μ‹€μ œ κ΅¬ν˜„λΆ€λ₯Ό μ•Œμ§€ λͺ»ν•˜λ”라도 ν•΄λ‹Ή κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 λœλ‹€. 좔상화 계측인 μΈν„°νŽ˜μ΄μŠ€ API의 정보λ₯Ό ν™œμš©ν•΄ ν•΄λ‹Ή μ„œλΉ„μŠ€μ˜ λͺ¨λ“  κΈ°λŠ₯을 μ΄μš©ν•˜λ©΄ λœλ‹€. λ˜ν•œ μ–Έμ œλ“ μ§€ ꡐ체할 수 있게 ν•΄μ€€λ‹€.
  • Spring WebFlux와 Spring MVCλŠ” λͺ¨λ‘ μŠ€ν”„λ§μ˜ μ›Ή κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€λ§Œ λ‚΄λΆ€μ μœΌλ‘œλŠ” λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λœλ‹€. κ°œλ°œμžλŠ” μ΄λŸ¬ν•œ λ‚΄λΆ€ κ΅¬ν˜„μ— μ‹ κ²½ μ“°μ§€ μ•Šκ³  μΌκ΄€λœ λ°©μ‹μœΌλ‘œ μŠ€ν”„λ§μ˜ μ›Ή κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λŠ” ν†°μΊ£μ—μ„œ netty둜의 μ „ν™˜κ³Ό 같은 변경사항을 μ†μ‰½κ²Œ μ²˜λ¦¬ν•  수 있게 ν•΄μ€€λ‹€.

μŠ€ν”„λ§μ—μ„œ μ œκ³΅ν•˜λŠ” PSA

Spring Web MVC

β˜‘οΈ μŠ€ν”„λ§μ—μ„œλŠ” Servlet을 톡해 κ°œλ°œμ„ ν•  수 있게 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. μ„œλΈ”λ¦Ώμ„ 톡해 HttpServlet 클래슀λ₯Ό 상속받고, doGet(), doPost() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ @Controller, @GetMapping, @PostMapping λ“±μ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ μš”μ²­ 맀핑을 ν•  수 μžˆλ‹€. 이렇듯 κ°œλ°œμžλŠ” λ³΅μž‘ν•œ μ„œλΈ”λ¦Ώ λ‘œμ§μ„ μž‘μ„±ν•  ν•„μš” 없이 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 μžˆλ‹€.

 

Spring Transaction

β˜‘οΈ Low Level둜 νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λ €λ©΄ setAuthCommit(), commit(), rollback()등을 직접 관리해야 ν•œλ‹€. ν•˜μ§€λ§Œ @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ λ©”μ†Œλ“œμ— λΆ™μ—¬μ€ŒμœΌλ‘œμ¨ νŠΈλžœμž­μ…˜ 처리λ₯Ό μ‰½κ²Œ ν•  수 μžˆλ‹€. μ΄λŠ” λ‹€μ–‘ν•œ νŠΈλžœμž­μ…˜ κ΄€λ¦¬μž(JpaTransactionManager, HibernateTransactionManager)와 ν•¨κ»˜ μ‚¬μš©ν•  수 있으며, κ°œλ°œμžλŠ” κ΅¬ν˜„ 세뢀사항을 μ‹ κ²½μ“°μ§€ μ•Šκ³ λ„ νŠΈλžœμž­μ…˜μ„ μ‰½κ²Œ 관리할 수 μžˆλ‹€.

 

Spring Cache

β˜‘οΈ Cache도 Transactionκ³Ό λ™μΌν•˜κ²Œ JCacheManager, ConcurrentMapCacheMannager, EhCacheCacheManager와 같은 κ΅¬ν˜„μ œλ₯Ό μ‚¬μš©ν• μˆ˜ μžˆλ‹€. κ°œλ°œμžλŠ” @Cacheable μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ κ΅¬ν˜„μ²΄λ₯Ό μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ ν•„μš”μ— 따라 ꡐ체할 수 μžˆλ‹€.

 

IOC(Inversion Of Control)

μ œμ–΄μ— μ—­μ „!! ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 객체의 생성과 생λͺ…μ£ΌκΈ° 관리λ₯Ό κ°œλ°œμžκ°€ μ•„λ‹Œ ν”„λ ˆμž„μ›Œν¬μ— μœ„μž„ν•˜λŠ” 것이닀. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” λ³΅μž‘ν•˜κ³  μ‹€μˆ˜ν•˜κΈ° μ‰¬μš΄ 둜우-레벨 μž‘μ—… λŒ€μ‹  핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑할 수 μžˆλ‹€.

public class A {
	private B b;
    public A() {
    	b = new B();
    }
}

μœ„ μ½”λ“œλ₯Ό 보고 "Aκ°μ²΄λŠ” B객체에 μ˜μ‘΄ν•˜κ³  μžˆμ–΄"라고 말할 수 μžˆλ‹€.

public class A {
	private final B b;
    @Autowired
    private B b;
}

μŠ€ν”„λ§μ—μ„œ μœ„μ™€ 같은 μ½”λ“œλ‘œ μ˜μ‘΄μ„±μ΄ μ£Όμž…λœλ‹€. 이것을 DI(Dependency Injection)이라 ν•œλ‹€.

 

➑️ 즉 μ™ΈλΆ€μ—μ„œ μ˜μ‘΄μ„ μ£Όμž…λ°›μœΌλ©΄ DI, κ·Έ 의쑴이 κ°œλ°œμžκ°€ μ•„λ‹Œ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 관리λ₯Ό ν•˜μ—¬ IOC라고 ν•œλ‹€.

AOP(Aspect Oriented Programming)

  • 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)의 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄ λ“±μž₯ν•œ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„μ΄λ‹€. 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 μž₯점 쀑 ν•˜λ‚˜λŠ” λͺ¨λ“ˆν™”와 μž¬μ‚¬μš©μ„±μ„ ν†΅ν•œ 쀑볡 κ°μ†Œμ§€λ§Œ ν”„λ‘œκ·Έλž¨μ΄ λ³΅μž‘ν•΄μ§μ— 따라 λͺ¨λ“ˆ λ‚΄μ—μ„œλ„ μ½”λ“œ 쀑볡이 λ°œμƒν•˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€.
  • 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ AOPλŠ” νš‘λ‹¨ 관심사(Crosscutting Concerns)λ₯Ό 닀룬닀. 예λ₯Ό λ“€λ©΄ λ‘œκΉ…, λ³΄μ•ˆ, νŠΈλžœμž­μ…˜ 관리와 같은 것을 λ§ν•œλ‹€. μ΄λŸ¬ν•œ νš‘λ‹¨ 관심사λ₯Ό λ³„λ„μ˜ λͺ¨λ“ˆ(Aspect)둜 λΆ„λ¦¬ν•˜κ³  ν•„μš”ν•œ 지점에 μ‚½μž…(Weaving)ν•˜λŠ” λ°©μ‹μœΌλ‘œ 쀑볡을 쀄이고 각 λͺ¨λ“ˆμ˜ 핡심 κΈ°λŠ₯에 집쀑할 수 있게 ν•΄μ€€λ‹€. 

참고자료 : https://github.com/devSquad-study/2023-CS-Study/blob/main/Spring/spring_bean_scope.md

728x90
λ°˜μ‘ν˜•