Studynote

POJO란?

e.sunie 2019. 4. 11. 17:59

 

 

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