spring
-
[IT용어] 프레임워크(Framework)와 라이브러리(Library)2019.11.18
[IT용어] 프레임워크(Framework)와 라이브러리(Library)
프레임 워크(Framework)
개념
원하는 기능 구현에만 집중하여 빠르게 개발할 수 있도록 기본적으로 필요한 기능을 갖추고 있는 것
프로그램의 기본이 되는 뼈대라고 보면 된다.
뼈대? 뭔 뼈대? 이해가 잘 가지 않는다.
예를 들면 공룡제작 프레임워크를 다운받아서 써보자.
기본으로 공룡 뼈대가 제작돼있다.
-티라노사우루스 뼈대
-벨로키랍토르 뼈대
-스피노사우루스 뼈대
-알로사우루스 뼈대
그럼 우리가 티라노사우루스 뼈대(프레임워크)를 골라 제작(코딩)을 한다고 가정했을 때,
티라노의 형태가 이미 만들어져있으니 살을 어떻게 붙일까만 집중해서 코딩할 수 있겠죠
그리고
뼈대엔 팔이 2개 있는데 새로운 뼈를 만들어서 팔을 3개 만들 순 없다.
왜? 팔 2개라고 정의 해놨으니까요 "티라노사우르스 뼈대는 팔이 2개다." 라고 말이죠
하지만? 팔을 굵게 만들고, 꼬리는 짧게 다리는 길게(메소드길게(메서드) 만들순 있습니다.
사용 이유
만약 공룡 제작 프레임워크가 없다면
그 뼈대 자체를 만드는데만 한 세월이 걸리게 됩니다.
하지만 프레임워크를 이용한다면 더욱 빠르게 만들 수 있고,
팔 2개 다리 2개 꼬리 1개 이렇게 정해져있으니 표준을 정할 수 있습니다.
예를 들어
공룡 제작프레임워크 소스를 받는다면 "아 팔 2개 다리 2개 꼬리 1개이겠구나" 알 수 있습니다.
언어별 대표 프레임워크
Java - Spring
Python - Django
PHP - Laravel
JavaScript - React
GO - Revel
Ruby - Rails
라이브 러리(Library)
개념
필요한 기능을 미리 준비 해놓은 개념
굉장히 범위가 포괄적이다.
미리 작성된 코드, 서브루틴(함수), 클래스, 값, 자료형
이 모두가 라이브러리에 속한다.
한마디로 재사용이 가능한 코드의 집합 이라고 보시면 됩니다.
예를 들면 위 예시처럼 공룡 제작 프레임워크를 쓰고 있다가
그냥 발톱이 아닌 강철 발톱을 쓰고 싶다면?
발톱은 팔 2개 다리 2개
총 4개나 들어간다.
그럼 라이브러리를 쓰지 않는다면 강철 발톱을 하나 만들어서
일일이 복사 붙여넣기 해야 한다.
매우 가독성이 떨어지며 유지보수도 굉장히 힘들다.
하지만 이미 만들어진 강철 발톱라이브러리가 있다면 그 라이브러리를 적용 시킴으로써
바로 강철 발톱을 장착 시킬 수 있다.
여기서 프레임워크의 강점이 또 나온다. 강철 발톱은 반드시 공룡 제작 프레임워크에만 사용 가능하다는 점.
(특정 프레임워크에 맞게 나온 라이브러리들이 많이 존재한다)
사용 이유
재사용이 필요한 기능으로 반복적인 코드 작성을 없앨 수 있다.
그러므로 개발이 훨씬 수월해진다.
대표 라이브러리
JavaScript - jQuery, Chart.js
Python - 아파치 Libcloud, Arrow,Behold
Java - JUnit, Jackson
'IT 용어' 카테고리의 다른 글
| [IT용어] SOP(Same-Origin Policy),CORS(Cross Origin Resource Sharing)란? (0) | 2019.12.03 |
|---|---|
| [IT용어] NameSpace(네임스페이스)란? (0) | 2019.11.29 |
| [IT용어] 정적,동적 프로그래밍 언어 (1) | 2019.11.18 |
| [IT용어] JSON(JavaScript Object Notation) (3) | 2019.11.14 |
| [IT 용어] REST,REST API,RESTful (0) | 2019.11.03 |
[Spring] DTO(Data Transfer Object)와 VO(Value Object)
DTO(Data Transfer Object)
개념
이름과 같이 계층 간 데이터 교환을 위해 사용하는 객체다.
*여기서 말하는 계층이란, View - Controller - Service - DAO와 같은 각 계층을 말한다.
VO와 혼용되어 쓰이나, 이는 보통 DTO를 지칭하는 말이다.
데이터를 담을 private 변수와 그 변수를 조작할 수 있는 Getter, Setter 메서드로 구성돼있음..
데이터를 오브젝트로 변환하는 객체 Getter, Setter 메서드로 구성!
사용 이유
form, ajax에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 ,
값을 받아야 할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name 속성의 이름이랑 매칭 되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 UserDTO를 자료형으로 값을 받을 수 있음
말이 어려워졌는데, 한 상황으로 정리하겠습니다.
DB : 데이터 줄게
DAO : 일일이 담기 귀찮다. 딱 맞는 바구니에 담을 수 없을까?
DAO : 아 유레카! 주는 데이터에 맞춰서 데이터 형식들을 만들어 놓은
클래스를 만들어야겠군 이름은 DTO라고 불러야겠다.
DB 값 → DAO → Service → DTO
문법
List<Company> result = menuservice.getCompanyList();
//getCompanyList() == select * from Company;
//DB 컬럼 이름에 맞춘 Company 클래스(DTO)에 자동으로 데이터 삽입됨
//예시 DTO
public class Company {
private int id;
private String name;
private String address;
private String registration_number;
private String representative;
private String description;
private String created_on;
private String updated_on;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getRegistration_number() {
return registration_number;
}
public void setRegistration_number(String registration_number) {
this.registration_number = registration_number;
}
public String getRepresentative() {
return representative;
}
public void setRepresentative(String representative) {
this.representative = representative;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCreated_on() {
return created_on;
}
public void setCreated_on(String created_on) {
this.created_on = created_on;
}
public String getUpdated_on() {
return updated_on;
}
public void setUpdated_on(String updated_on) {
this.updated_on = updated_on;
}
@Override
public String toString() {
return "Company [id=" + id + ", name=" + name + ", address=" + address + ", registration_number="
+ registration_number + ", representative=" + representative + ", description=" + description
+ ", created_on=" + created_on + ", updated_on=" + updated_on + "]";
}
}
VO(Value Object)
개념
값을 가진 객체
데이터만 가지고 있다는 것만 보면 DTO와 비슷한데,
가장 큰 특징은 value가 같으면 같은 객체라고 보는 거예요.
Company a = new Company("대기업");
Company b = new Company("대기업");
a.hashCode();
b.hashCode();
해쉬 값이 동일하다. 즉 같은 것으로 판단
그리고 read-only 값을 가지고 있음 즉, 변하지 않는 immutable 한 성질을 가지고 있음. 중간에 값을 바꿀 수가 없음.
문법
DTO와 VO를 구분할 수 있는 아주 좋은 형태
get/set = DTO
get = VO
setter는 없고 getter만 있는 형태!
public class BoardVO {
private int id;
private String subject;
private String context;
private String attachments;
private int likes;
private int views;
private int writer;
private Date create_time;
public int getId() {
return id;
}
public String getSubject() {
return subject;
}
public String getContext() {
return context;
}
public String getAttachments() {
return attachments;
}
public int getLikes() {
return likes;
}
public int getViews() {
return views;
}
public int getWriter() {
return writer;
}
public Date getCreate_time() {
return create_time;
}
@Override
public String toString() {
return "BoardVO [id=" + id + ", subject=" + subject + ", context=" + context + ", attachments=" + attachments
+ ", likes=" + likes + ", views=" + views + ", writer=" + writer + ", create_time=" + create_time + "]";
}
}
DTO VS HashMap
DTO 쓰지 않고 HashMap을 쓰면 안 될까?
가장 큰 이유는 compile time 오류와 관련 있습니다.
HashMap은 컴파일 시에 오류를 잡아내질 못합니다.
DTO
dto.setName("gildong");
String name = dto.getName();
HashMap
map.put("name", "gildong");
String name = map.get("name");
정리
HashMap 단점
1. 해쉬 맵은 get이나 put에서의 key가 잘못돼도 컴파일 시에는 에러를 잡아내질 못함.
즉, map.put("names")라고 해도 에러가 나질 않죠.
반면에, dto.steNames() 나 dto.getNames()는 에러가 나서 컴파일조차 되지 않을 겁니다.
2. 데이터 타입에 대한 에러를 잡아내질 못합니다.
String인지 Integer인지를 컴파일 시에는 모르죠.
3. 해쉬 맵은 프로그램 말고도 별도의 정보가 필요합니다.
dto는 그 자체가 필요한 정보를 담고 있습니다.
name, address, age 등 dto의 정의만 봐도 대충은 알 수 있는데 반하여,
해쉬 맵은 이 데이터를 정의한 다른 문서가 필요합니다.
이는 규모가 큰 프로그램일수록 더 필요하죠.
HashMap 장점 및 사용 이유
1. 데이터의 필드들이 가변적인 경우
2. 매우 복잡한 구조로 되어 있어 DTO로 규정하기는 곤란한 경우
3. DTO가 너무나 많아지는 경우
4. 한 select 문 쿼리에 여러 개의 count 정보를 담을 때
5. 한번 쓸건데, 이걸 위해 DTO를 만들기도 뭐할 때
'Spring' 카테고리의 다른 글
| [Spring] GET 파라미터(parameter) 데이터 받기 총 정리 (0) | 2019.12.15 |
|---|---|
| [Spring] MyBatis 데이터 HashMap으로 받기 (0) | 2019.10.31 |
| [Spring] @Scheduled (0) | 2019.10.30 |
| [Spring] GET과 POST의 차이점과 문법 정리 (0) | 2019.10.21 |
| [Spring] annotations 정리 (0) | 2019.10.16 |
[Eclipse] 잘되던 프로젝트가 갑자기 안될때(feat.HTTP 404)
이 글은 이클립스(IDE) 기반으로 설명합니다.
어제까지 잘되던 프로젝트가 내일 출근하고 보니 맛(?)이 갈 때가 있습니다. 바아로 따라해봅시다
1.Project
2.Clean…

1.Servers 탭
2.Tomcat version Server at localhost [] 마우스 우클릭
3.Clean… or Clean tomcat work directory

Tomcat Clean… VS Clean tomcat work directory
Clean… : 모든 파일(java, jsp, xml)등의 파일들을 컴파일하여 재적용
기존 컴파일 Class에 덮어쓰기
Clean tomcat work directory : context별 폴더에 저장된 컴파일 Class 파일들을 지우고 재컴파일
기존 컴파일 Class 파일들 삭제 후 다시 생성
이 방법에도 안된다면 Java Build Path 재컴파일...아니면 Git Pull 할때 이상한 파일이 딸려왔는지 확인
pom.xml에 maven 디펜던시 추가 후 안될 때
1.이클립스 프로그램 종료
2.C:\Users\사용자이름\.m2\repository 폴더 삭제 후 다시 이클립스 재가동
3.우측 하단에 Building workspace ( ?% )가 없어질 때 까지 대기 후 Run on Server
'IDE' 카테고리의 다른 글
| [Eclipse] 자주 쓰는 알짜배기 단축키 총 정리 (0) | 2019.12.15 |
|---|---|
| [Eclipse] Git(깃),GitLab(깃 랩),GitHub(깃허브) 연동,연결 하기 (1) | 2019.12.06 |
| [Eclipse] 메소드 자동 주석 툴팁 없애기 설정(Feat.// TODO Auto-generated method stub) (1) | 2019.11.11 |
| [Eclipse] Console 탭에 메시지가 출력이 안될때 (0) | 2019.10.02 |
| [Eclipse]모든 인코딩(Encoding) UTF-8 설정하기 (1) | 2019.09.11 |
