๐Ÿ’ก ์ด ํฌ์ŠคํŒ…์€ ์Šคํ”„๋ง ์Šคํ„ฐ๋””์— ๋งž๊ฒŒ ๊ตฌ์„ฑ๋œ ๊ฒƒ์ด๋ฉฐ, ์ถ”ํ›„ ๊ธ€์˜ ๊ตฌ์กฐ์™€ ๋‹ค๋ฃจ๋Š” ๋ฒ”์œ„๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ  ๋ฐ”๋ž€๋‹ค.

 

POJO(Plain Old Java Object)๋ž€?

JLS(Java Language Specification)์— ์˜ํ•ด ๊ฐ•์ œ๋œ ๊ฒƒ ์ด์™ธ์˜ ์ œํ•œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ถ€๋ฅด๋Š” ์šฉ์–ด์ด๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” '์ œํ•œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š”' ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž.

 

๐Ÿ’ก JLS(Java Language Specification)

์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์œ„ํ•œ ๋ฌธ๋ฒ•๊ณผ ์ •์ƒ์ ์ธ/๋น„์ •์ƒ์ ์ธ ๊ทœ์น™, ์ •์ƒ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ ๋ฐฉ๋ฒ•๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ์ž๋ฐ” ํ‘œ์ค€ ๋ฌธ์„œ๋ฅผ ๋งํ•œ๋‹ค. ์ž๋ฐ” ํ‘œ์ค€์— ๋Œ€ํ•ด ๋” ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์ž๋ฐ” ํ‘œ์ค€ - JLS(Java Language Specification), JSR(Java Specification Request), JEP(Java Enhancement Proposal) ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ  ๋ฐ”๋ž€๋‹ค.

 


ํŠน์ • ๊ทœ์•ฝ์— ์ข…์†๋˜์ง€ ์•Š์Œ

// MessageListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ POJO๊ฐ€ ์•„๋‹˜
public class BestStarListener implements MessageListener {

    @Override
    public void onMessage(Message message) {
        if (message instanceof TextMessage) {
            try {
                System.out.println(((TextMessage) message).getText());
            }
            catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
    }

}

// ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ MessageListener ์ธํ„ฐํŽ˜์ด์Šค์™€์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ˜ POJO
@Component
public class MyListener {

  @JmsListener(destination = "myDestination")
  public void processOrder(String data) {
    System.out.println(data);
  }
}

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ JMS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด MessageListener๋ฅผ ์ƒ์†๋ฐ›์•„์„œ๋Š” ์•ˆ๋œ๋‹ค. ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ ์‹œ ํ˜ธํ™˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ๋งŒํผ ๊นŒ๋‹ค๋กœ์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํŠน์ • ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€ ์•Š์Œ

public class Foo extends javax.servlet.http.HttpServlet { ... }

์˜ˆ๋ฅผ ๋“ค์–ด ์›น ํ™˜๊ฒฝ์— ์ข…์†๋˜๋Š” HttpServletRequest๋‚˜ HttpSession์™€ ๊ด€๋ จ๋œ API๋ฅผ ์ง์ ‘ ์ด์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

์ด ์—ญ์‹œ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ ์‹œ ํ˜ธํ™˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ทธ๋งŒํผ ๊นŒ๋‹ค๋กœ์›Œ์ง€๊ณ , ์›น ํ™˜๊ฒฝ์— ์ข…์†๋ผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๊ธฐ์ˆ ์ ์ธ ๋‚ด์šฉ์„ ๋‹ด์€ ์ฝ”๋“œ๊ฐ€ ์„ž์—ฌ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง€๊ณ , ๋…๋ฆฝ์ ์œผ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

 

๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ์ง€ํ‚ค๋Š” ํด๋ž˜์Šค

์ฑ…์ž„๊ณผ ์—ญํ• ์ด ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋„ฃ๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด์ง€ํ–ฅ ์›์น™์—์„œ ๊ทธ๋งŒํผ ๋ฉ€์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ง„์ •ํ•œ POJO๋ผ ํ•  ์ˆ˜ ์—†๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด ํŠน์ • ํ™˜๊ฒฝ๊ณผ ๊ทœ์•ฝ์— ์ข…์†๋˜์ง€ ์•Š์•„ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„๋œ ์˜ค๋ธŒ์ ํŠธ์ด๋ฉฐ

๊ฐ์ฒด์ง€ํ–ฅ์  ์›์น™์„ ์ง€ํ–ฅํ•˜๋Š” ๊ฒƒ์ด POJO๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.


์—ฌ๋Ÿฌ ํฌ์ŠคํŒ…์—์„œ POJO๋ฅผ 'Getter์™€ Setter๋ฅผ ๊ฐ€์ง„ ๋‹จ์ˆœํ•œ(Plain) ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ' ์ •๋„๋กœ๋งŒ ์ •์˜ํ•˜๋˜๋ฐ,

์ด๋Š” POJO์˜ ํŠน์ง• ๊ด€์ ์—์„œ ๋ดค์„ ๋•Œ ์˜์กด์„ฑ์ด ์—†๊ณ  ์ฝ”๋“œ ์ˆ˜์ •๊ณผ ํ…Œ์ŠคํŠธ์—๋„ ์šฉ์ดํ•˜๋ฏ€๋กœ ์กฐ๊ฑด์ด ๋งž์•„์„œ POJO๊ฐ€ ๋  ์ˆ˜ ์žˆ์—ˆ์„ ๋ฟ ๋ฐ˜๋“œ์‹œ Getter์™€ Setter๋ฅผ ๊ฐ€์ ธ์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๋ง์€ ์•„๋‹ˆ๋‹ค.

 

๐Ÿ’ก Getter/Setter 

์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์—ญํ• ์˜ ๋ฉ”์„œ๋“œ๋ฅผ Getter, ์„ค์ •ํ•˜๋Š” ์—ญํ• ์˜ ๋ฉ”์„œ๋“œ๋ฅผ Setter๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿ’ก ์ž๋ฐ”๋นˆ(JavaBean)

ํŠน์ •ํ•œ ๊ด€๋ก€๋ฅผ ์ง€ํ‚ค๋ ค๋Š” ์ž๋ฐ”๋นˆ(JavaBean) API ์ŠคํŽ™ ํ‘œ์ค€์ด ์ง€์ผœ์ง„ ํด๋ž˜์Šค๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”๋นˆ ์ŠคํŽ™ ๋ฌธ์„œ์˜ ๊ธฐ๋ณธ๊ฐœ๋… ํŒŒํŠธ์™€ ์œ„ํ‚ค๋ฐฑ๊ณผ๋ฅผ ์ฐธ๊ณ ํ•œ ๊ฒฐ๊ณผ ์•„๋ž˜ 4๊ฐ€์ง€ ๊ทœ์น™์„ ์ง€ํ‚ค๋Š” ํด๋ž˜์Šค์ด๋‹ค.

  1. ๋ชจ๋“  ํ•„๋“œ๋Š” private์ด๋ฉฐ, Getter/Setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  2. ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๊ฐ€ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.
  3. ์ง๋ ฌํ™”๋ผ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  4. (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ์–ด๋–ค ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ์•Œ๋ฆฌ๋Š” '์ด๋ฒคํŠธ(Event) ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ'๋ฅผ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์•„๋งˆ ์œ„ ์ž๋ฐ”๋นˆ ๊ทœ์น™ ์ค‘ Getter/Setter ๋ฉ”์„œ๋“œ ๋ถ€๋ถ„๋งŒ ๋ณด๊ณ  POJO์™€์˜ ๊ด€๊ณ„๋ฅผ ์ž˜๋ชป ์ •๋ฆฌํ•ด๋‚ธ ๊ฒŒ ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค.

 

์ด๋Ÿฌํ•œ POJO๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋น„๋กฏํ•œ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์ง€ํ–ฅ ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํƒ„์ƒํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


POJO๋ฅผ ์ง€ํ–ฅํ•ด์•ผ ํ•˜๋Š” ์ด์œ  - ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ์žฅ์ ์„ ์–ป๊ธฐ ์œ„ํ•ด

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ด์ „์—๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ธฐ์ˆ ์„ ์ง์ ‘ ์˜์กดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์‘์ง‘์„ฑ์ด ๋‚ฎ์•„์ ธ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์กŒ๋‹ค. ์ฆ‰, ๊ฐ์ฒด์ง€ํ–ฅ์„ ์ถ”๊ตฌํ•˜๋Š” ์ž๋ฐ”๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ์žฅ์ ๋“ค์„ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ POJO๋ผ๋Š” ๊ฐœ๋…์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

 

๐Ÿ’ก ๊ทธ๋Ÿผ์—๋„ ํŠน์ • ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋Ÿด๋• ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฐ€? - PSA(Portable Service Abstraction)

ํŠน์ • ๊ธฐ์ˆ ์— ์ข…์†์ ์ด๋ฉด POJO๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์—์„œ๋Š” ๋งˆ๋ จํ•ด๋‘” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—ฐ๊ฒฐ์ง“๊ธฐ ์œ„ํ•ด 'JPA'๋ผ๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •ํ•ด๋‘์—ˆ๊ณ , ์ด์™€ ๊ด€๋ จ๋œ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ์ด JPA๋ผ๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค ์•„๋ž˜ ๊ตฌํ˜„๋˜์–ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. 

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ํ™˜๊ฒฝ์˜ ๋ณ€ํ™”์™€ ๊ด€๊ณ„์—†์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์˜ ๊ธฐ์ˆ  ์ ‘๊ทผ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™” ๊ตฌ์กฐ๋ฅผ ์Šคํ”„๋ง์—์„œ๋Š” PSA๋ผ๊ณ  ํ•œ๋‹ค. PSA์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ„๋„๋กœ ํฌ์ŠคํŒ… ํ›„ ๋งํฌ๋ฅผ ๊ฑธ์–ด๋‘˜ํ…Œ๋‹ˆ ์ฐธ๊ณ  ๋ฐ”๋ž€๋‹ค.


์ถœ์ฒ˜

POJO(Plain Old Java Object)

en.wikipedia.org/wiki/Plain_old_Java_object

 

JMS(Java Message Service) ์˜ˆ๋ฌธ

docs.spring.io/spring-framework/docs/4.3.25.RELEASE/spring-framework-reference/html/jms.html

 

์ž๋ฐ”๋นˆ(JavaBean) ํ‘œ์ค€

ko.wikipedia.org/wiki/์ž๋ฐ”๋นˆ์ฆˆ

download.oracle.com/otndocs/jcp/7224-javabeans-1.01-fr-spec-oth-JSpec/