본문 바로가기
Studynote

POJO란?

by e.sunie 2019. 4. 11.

 

 

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC

 

스프링 프레임워크 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 스프링 프레임워크(Spring Framework)는 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 간단히 스프링(Spring)이라고도 불린다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다. 로드 존슨이 2002년에 출판한 자신의 저서인 Expert One-on-One J2EE

ko.wikipedia.org

 

궁금증의 시작

스프링은 POJO방식의 프레임워크이다.

 

https://itewbm.tistory.com/entry/POJOPlain-Old-Java-Object

 

POJO(Plain Old Java Object)

더 자바답게! 더 슬림하게! 다이어트 POJO 프로그래밍 지난 몇 년간 EJB3를 포함한 많은 자바의 새로운 기술과 제품들은 저마다 POJO 프로그래밍의 지원을 주요 장점으로 내세우며 등장했다. 그러나 POJO 프로그래..

itewbm.tistory.com

잘못된 POJO 기반 코드의 예시

class MyService {
	private MyDAO myDAO;
	pivate XXDao xxDAO;
	
	...
	
	public MyVo foo(UrVO urVo) throws MyException {
		Connection con = null;
		try {
			con = DBUtill.getConnection();
			con.setAutoCommit(fals);
			
			if(xxDAO.check(urVo))
				return myDAO.foo(con,urVo);
			else
				return myDAO.boo(con,urVo);
		}
		catch (MyException e){
			con.rollback();
			throw e;
		}
		catch (Exception e){
			throw new MyException(e, "XXX00001");
			con.rollback();
		}
		finally{
			con.commit();
			DBUtill.close(con);
		}
	}
	
	...
	
}

class MyDAO {
	public void foo(Connection con, UrVO urVO) throws MyException {
		PreparedStatement pstmt = null;
		try {
			pstmt = new LoggablePreparedStatement(con,QueryFactory.getInstance().getQuery("FOO"));
			pstmt.setInt(1,urVO.getSeq());
			if(pstmt.executeUpdate() != 1){
				throw new MyException("SVM00009");
			}
		}
		catch (MyException e){
			throw kble;
		}
		catch (Exception e){
			throw new MyException(e);
		}
		finally {
			DBUtill.close(pstmt);
		}
	}
	
	...
	
}

 

POJO 기반 코드의 2가지 기준

1. 객체지향적인 설계원칙에 충실하도록 개발되었는가

- try-catch와 같은 템플릿 코드 사용이 많음 > 테스트하기 힘든 구조

2. 테스트 코드 개발의 용이성이나 테스트 코드를 잘 작성했는가

- 수정 > 빌드 > 배포 > 테스트 방식을 탈피하지 못하면 EJB개발

- 잘 만들어진 POJO 애플리케이션은 자동화된 테스트 코드 작성이 편리

 

DAO 코드의 가장 큰 문제점 : JDBC의 오랜 코드 스타일을 그대로 사용

- try/catch/finally의 전형적인 템플릿 코드가 실제 DAO 로직보다 더 많은 라인을 차지.

- Query를 불러오는 부분에서 Singletone 사용

- JDBC 코드를 간략하게 작성하도록 돕는 유틸리티 클래스를 사용했지만 정적 메서드를 이용.

 

> Singletone과 정적메서드는 테스트 코드를 만드는 큰 장애물 

테스트를 쉽게하기 위한 모의 객체(Mock Object)로 변환하는것이 불가능하기 때문

 

https://medium.com/@SlackBeck/mock-object%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-85159754b2ac

 

Mock Object란 무엇인가?

다른 누군가로부터 휴대 전화 서비스(CellphoneService) 기능을 제공 받아 이를 사용한 휴대 전화 문자 발신기(CellphoneMmsSender)를 프로그래밍 한다고 생각해 보자.

medium.com

public class MyDAO {
		private DataSource dataSource;
		private SimpleJdbcTemplate jdbcTemplate;
		private QueryFactory queryFactory;
		//setter methods
		public void foo(UrlVo UrlVo)   {
			jdbcTemplate.update(queryFactory.getQuery("FOO").UrlVo.getSeq());
		}
}

개선

1. 객체지향적 설계방식에 따라 Query를 가져오는 기능을 인터페이스로 만드러 사용하고

이를 구현한 Object를 DAO에서 참조할 수 있도록 하는 것이 바람직하다. 

2, 또한 과도한 테플릿 코드 제거 및 반복적인 JDBC workflow제거를 위해 Call back 방식으로 구현 

 

> DAO의 data acess logic과 JDBC 처리 workflow 구분가능

 

============================================================================

 

코드설명

 

MyDAO는 DataSource, QueryFactory라는 협력객체를 interface를 통해 acess하므로 해당 오브젝트의 구현에 상관없이 동작할 수 있다. 

 

 

 

============================================================================

 

퍼시스턴스 기능

https://m.blog.naver.com/PostView.nhn?blogId=writer0713&logNo=220880329884&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

[java] 퍼시스턴스 프레임워크 - Persistence Framework

mybatis를 공부하다 보니 아래와 같은 설명이 있었다. 마이바티스는 개발자가 지정한 SQL, 저장프로시저...

blog.naver.com

 

컨테이너 = 가벼운 가상머신

 

https://goofcode.github.io/container-101

 

컨테이너란 무엇인가 101 - 초심자를 위한 컨테이너 기술

원문: Demystifying Containers 101: A Deep Dive Into Container Technology for Beginners

goofcode.github.io

 

비즈니스 로직이란?

https://mommoo.tistory.com/67

 

비즈니스 로직(Business Logic)이란?

안녕하세요. Mommoo 입니다. 프로그래밍에 관한 일을 하다보면 많이 듣는 용어중 하나 인, 비즈니스 로직(Business Logic)에 대하여 포스팅 합니다. 영역 구분하기 홈페이지 회원가입으로 예를 들어봅시다. 유저는..

mommoo.tistory.com

 

'Studynote' 카테고리의 다른 글

[정리] Object-C Chapter 20 메모리 누수 막기  (0) 2018.11.03

댓글