Map
- key와 Value의 쌍으로 값을 저장하는 컬렉션
- 대응관계를 쉽게 표현할 수 있게 해주는 자료형
- 보통 select를 사용하는 경우에 2개 이상의 테이블을 조인하여 조회하는 경우가 많아 VO로는 표현이 복잡하여 Map을 사용하며 Map의 경우는 변수명을 바꿔가면서 계속적으로 put 할 수가있다.
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("StartNum", 1)
map.put("EndNum", 4)
jdbc.queryForObject(쿼리문, map, 클래스(또는 rowMapper));
단점
- Map은 Key 또는 value가 null이면 Map의 해당 필드 자체를 Key로 가져가지 않는다 따라서, 쿼리 수행 시 key 값 자체가 존재하지 않아 오류가 발생한다.
- 여러 타입을 담아야 하기에 Map은 Value 선언 시 Object로 할 수밖에 없고 이 또한 Object는 최상위 타입이기 때문에 type이 매치되지 않는 경우가 발생해도 실제로 돌려보지 않고는 알 수 가 없다.
- Object로 선언하여 모든 타입을 담기 때문에 부가적인 casting 작업이 발생 할 수 있다.
VO
- 데이터 그 자체로 의미 있는 것을 담고 있는 객체
- DTO와 같은 개념이나 차이점은 Read-Only 속성 개체
- 간단한 독립체(Entity)를 의미하는 작은 객체를 의미한다.
- 비즈니스 로직상 데이터가 명확해야 하는 경우
- 특정값의 key 또는 value가 null인 경우 VO클래스 내에 선언된 타입으로 초기화 수행되어 쿼리 수행시 null로 인한 오류가 없음.
- 멤버 변수에 대한 구체적인 타입을 선언하기 때문에 타입이 매치되지 않는 경우 컴파일 에러가 발생하여 바로 알 수 있다.
- 반드시 값이 필요한 변수에 대해 생성자 파라미터로 필요한 값을 넣을 수 있어, 이 값이 없는 경우 컴파일 에러가 발생한다.
public class PageVO {
private Integer StartNum;
private Integer EndNum;
}
PageVO vo = new PageVO();
vo.setStartNum(1);
vo.setEndNum(4);
단점
- VO는 지정한 변수에만 set 할 수가있다.
- Map에 비해 소스가 많아진다.
- getter, setter 메소드를 일일이 작성해주어야 하는 번거로움이 있다.(현재는 Lombock을 사용하여 어노테이션 형태(@Getter, @Setter)로 조금 더 간편하게 사용할 수 있다.)
DTO
- 계층 간 데이터 교환을 위한 객체
- 일반적인 DTO는 로직을 가지고 있지 않고 순수한 데이터 객체이며 속성과 속성에 접근하기 위한 getter, setter 메서드로만 구성되는 POJO
※ POJO란?
더보기
Plain Old Java Object
POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다.
이 POJO라는 개념이 등장하게 된 계기로는 자바코드가 특정 ‘기술’과 환경에 종속되어 의존하게 된 자바 코드는 가독성이 떨어져 유지보수가 어렵고 확장성이 매우 떨어지는 단점이 있었고 이는 객체지향 언어인 자바가 객체지향의 장점들을 잃어버리게 되는 것이기에 POJO가 등장하게 되었다.
POJO의 간단한 예제로는
public class page {
private String pageName;
private int startNum;
public String getPageName() {
return startNum;
}
public String getStartNum() {
return startNum;
}
public void setPageName(String pageName) {
this.pageName = pageName;
}
public void setStartNum(int startNum) {
this.startNum = startNum;
}
}
이처럼 Getter와 Setter로 구성된 가장 순수한 형태의 기본 클래스 또는, 가장 기본적인 형태의 java객체를 POJO라고 한다.
※ 로직이란?
더보기
일반적으로 로직이라는 것은 어떤 프로그램을 만들 때의 논리적인 흐름을 말한다.
예를 들어 프로그램이라는건 크게 입력과 처리, 출력단계로 나눌 수 있을텐데 이 단계가 진행되는 사이에 많은 로직, 즉 논리적인 흐름들이 포함이 된다. 가령 숫자를 입력받아서 1에서 9까지 곱한 결과를 나타내는 프로그램이라 한다면 입력을 받고, 그 입력을 넘겨서 1부터 9까지 곱해주고, 그 값을 출력해주는 일련의 과정들을 로직이라 부를 수 있고 좀 더 구분해서 비즈니스 로직으로 세분화하기도 한다.
이렇듯 흔히 개발자들이 로직이 충돌한다는 말을 사용하는데 이 로직이 충돌한다는건 이런 논리적 흐름이 깨진다고 볼 수 있을 것이다.
예를 들어 위에서 1부터 9까지 곱하는 결과를 가져오는 프로그램인데, 추가로 입력값을 더 받는다던지 하면 원래 프로그램의 논리적 흐름과 충돌이 될 것이다.
입력값을 하나만 받고 그 값에 1부터 9까지 곱해서 결과를 출력해주는 것인데, 입력값이 하나 더 늘어났으니 전체 흐름이 바뀔 수 있는 것이다.
그리고 이런 로직을 보다 명확히 보여주고 코드를 보다 간결하게 해주는 것이 동적타이핑(Dynamic typing) 언어이다.
※ 동적타이핑(Dynamic typing)이란?
더보기
동적타이핑은 코드를 작성하는데 있어서 컴퓨터적 구조를 생략한다.
따라서 변수를 지정할 때 해당 변수의 데이터 타입 등을 명시하지 않아도 컴퓨터가 알아서 해석하도록 냅둔다.
예를 들어 a = 15 라는 식으로 변수를 지정할 때 a가 숫자라고 명시 하지 않더라도 컴퓨터는 이를 스스로 숫자라 해석한다.
이러한 방식은 코드를 보다 간결하게 해주며 코드의 로직을 보다 명확히 보여줄 수 있지만,
데이터 타입이 뭔지 파악하는 것을 컴퓨터에게 맡기기 때문에 그 만큼 실행속도가 느려진다는 단점이 있지만
처음 프로그래밍을 학습하는 사람에게 적합한 언어이며 속도를 중요시하는 작업에선 사용하기 부적합하지만 작고 단순한 프로젝트를 하기엔 적합하다.
동적 타이핑을 사용하는 언어 - 파이썬, 루비, php 등..