
1. 테스트 파일 강사님 Github에서 다운받기

2. 파싱하는 방법
- DB에서 받은 걸 view에 담기
- 생성자를 써서 플랫한 데이터를 울퉁불퉁하게 받기
1) 데이터를 객체로 변환
DTO(Data Transfer Object)에 데이터를 담는 행위
2) DBData1 클래스와 ViewData1 클래스의 인스턴스를 생성
해당 클래스의 객체를 만든다는 것
클래스를 사용하여 메모리에 실제로 데이터를 담을 수 있는 객체를 생성 = new하는 것
3) 데이터를 하나의 객체에서 다른 객체로 복사하여 파싱
- 하나의 인스턴스(예: DBData1 인스턴스)에서 데이터를 읽어옴
- 이 데이터를 새로운 인스턴스에 복사
원본 데이터의 값을 새로운 객체에 설정하는 것
복사하는 과정에서 데이터를 원하는 형태로 가공하거나 조작할 수 있음
- 복사한 데이터를 담은 새로운 인스턴스를 리스트에 추가
데이터를 가공한 후 새로운 객체를 생성하고, 그 객체를 리스트에 추가
3. ex01 문제 : DBData1을 ViewData1로 옮기시오
- 주어진 코드
package ex01;
import ex01.model.User;
public class App1 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData1 dbData = new DBData1(1, "제목1", "내용1", 3, "love", "love@nate.com");
// 2. dbData1를 ViewData1에 옮기시오 - ORM
}
}
package ex01;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class DBData1 {
private int boardId;
private String title;
private String content;
private int userId;
private String username;
private String email;
}
package ex01;
import ex01.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ViewData1 {
private int boardId;
private String title;
private String content;
private User user;
}
- DBData1의 내용 확인하기
board의 정보와 user의 정보로 구분됨

- ViewData1에서 user의 정보는 user 객체로 받아오기
package ex01;
import ex01.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ViewData1 {
private int boardId;
private String title;
private String content;
private User user;
}
- DB에서 가져온 데이터는 플랫한 데이터(TABLE 형태)
- 자바에서 사용하는 데이터는 굴곡진 데이터(OBJECT 형태)
- User의 정보를 가져오기 위해서 new해서 메모리에 띄우고 getter를 이용해서 정보 가져오기
- board의 정보는 ViewData1을 new해서 getter을 이용해서 정보 가져오기
package ex01;
import ex01.model.User;
public class App1 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData1 dbData = new DBData1(1, "제목1", "내용1", 3, "love", "love@nate.com");
// 2. dbData1를 ViewData1에 옮기시오 - ORM
// 썩은 방법
// ViewData1 viewData1 = new ViewData1();
// viewData1.setBoardId(dbData.getBoardId());
// viewData1.setTitle(dbData.getTitle());
// viewData1.setContent(dbData.getContent());
// System.out.println("viewData1: " + viewData1);
// user.setUserId(dbData.getUserId());
// user.setUsername(dbData.getUsername());
// user.setEmail(dbData.getEmail());
// System.out.println("User: " + user);
// 좋은 방법
User user = new User(dbData.getUserId(), dbData.getUsername(), dbData.getEmail());
ViewData1 viewData1 = new ViewData1(dbData.getBoardId(), dbData.getTitle(), dbData.getContent(), user);
System.out.println(user);
System.out.println(viewData1);
}
}

4. ex01v2 패키지 만들기 - 바꾸는 소스에서 적는 코드
- ex01 버전이 기본!
- 추가로 DBData_v3 객체로 변환
ViewData_v2에 ViewData_v2()안에 ViewData_v2를 넣어 dbData로 가져올 수 있게 변수를 설정
board의 데이터를 getter해서 가져옴
- user의 정보도 동일하게 user를 new해서 getter로 정보 가져오기
- 정보들이 담긴 ViewData_v2를 new해서 메모리에 띄우고 가져온 정보가 있는 변수 dbData를 ()안에 적어주기
package ex01v2;
public class App_v2 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData_v2 dbData = new DBData_v2(1, "제목1", "내용1", 3, "love", "love@nate.com");
// 2. dbData1를 ViewData1에 옮기시오 - ORM
ViewData_v2 viewData_v2 = new ViewData_v2(dbData);
System.out.println(viewData_v2);
}
}
package ex01v2;
import ex01.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class ViewData_v2 {
private int boardId;
private String title;
private String content;
private User user;
// 직접 생성자를 만들어야 함
// DBData_v3 객체로 변환
public ViewData_v2(DBData_v2 dbData) {
this.boardId = dbData.getBoardId();
this.title = dbData.getTitle();
this.content = dbData.getContent();
this.user = new User(dbData.getUserId(), dbData.getUsername(), dbData.getEmail());
}
}
5. ex01v3 패키지 만들기 - 바꾸려고 하는 소스에서 적는 코드
- ex01 버전이 기본!
- 추가로 DBData_v3에서 DBData_v3 객체를 새로운 ViewData_v3 객체로 변환
DBData_v3 객체를 필요로 하는 곳에서 ViewData_v3 객체를 사용할 수 있음
package ex01v3;
import ex01.DBData1;
import ex01v3.model.User_v3;
public class App_v3 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData_v3 dbData = new DBData_v3(1, "제목1", "내용1", 3, "love", "love@nate.com");
// 2. dbList(컬렉션을) ViewData2(오브젝트)에 옮기시오 - ORM
ViewData_v3 viewData = dbData.toViewData();
System.out.println();
System.out.println(viewData);
}
}
package ex01v3;
import ex01.model.User;
import lombok.AllArgsConstructor;
import lombok.Data;
@AllArgsConstructor
@Data
public class DBData_v3 {
private int boardId;
private String title;
private String content;
private int userId;
private String username;
private String email;
// 바꾸려고하는 소스에서 적는 코드
// DBData_v3 객체를 새로운 ViewData_v3 객체로 변환
public ViewData_v3 toViewData() {
return new ViewData_v3(
boardId,
title,
content,
new User(userId, username, email)
);
}
}
6. ex02 문제 : DBData2를 ViewData2로 옮기시오
- 주어진 코드
package ex02;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class App2 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData2 dbData1 = new DBData2(1, "제목1", "내용1", 1, "댓글1");
DBData2 dbData2 = new DBData2(1, "제목1", "내용1", 2, "댓글2");
DBData2 dbData3 = new DBData2(1, "제목1", "내용1", 3, "댓글3");
List<DBData2> dbList = Arrays.asList(dbData1, dbData2, dbData3);
// 2. dbList(컬렉션을) ViewData2(오브젝트)에 옮기시오 - ORM
}
}
package ex02;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@Data
public class DBData2 {
private int boardId;
private String title;
private String content;
private int replyId;
private String comment;
}
package ex02;
import ex02.model.Reply;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Data
public class ViewData2 {
private int boardId;
private String title;
private String content;
// Board 데이터만 넣는 생성자
public ViewData2(int boardId, String title, String content) {
this.boardId = boardId;
this.title = title;
this.content = content;
}
// 댓글들은 addReply로 추가하기
private List<Reply> replies = new ArrayList<>();
public void addReply(Reply reply){
replies.add(reply);
}
}
- ex01 버전이 기본임!
- board 데이터만 넣는 생성자를 만들고 파라미터로 List를 넣어줌
List에서 값을 받아서 넣어주는데 보드의 값은 중복되지 않는 하나의 값이기에 get(0) 해주기
- reply를 new해서 getter로 데이터 가져와서 List에 추가해주기
- List에 DB데이터를 넣기
package ex02;
import ex02.model.Reply;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Data
public class ViewData2 {
private int boardId;
private String title;
private String content;
// Board 데이터만 넣는 생성자
public ViewData2(List<DBData2> dbList) {
if (dbList.size() > 0) { // 0일때 터짐 방지
this.boardId = dbList.get(0).getBoardId();
this.title = dbList.get(0).getTitle();
this.content = dbList.get(0).getContent();
}
// 첫번째 방법
//dbList.stream().forEach(data -> {
// addReply((new Reply(data.getReplyId(), data.getComment())));//});
// 두번째 방법
// map으로 가공해서 toList로 수집하면 data가 reply가 됨
// replies = dbList.stream().map(data->new Reply(data.getReplyId(), data.getComment())).toList();
// 세번째 방법
for(DBData2 data : dbList) {
Reply r = new Reply(data.getReplyId(), data.getComment());
addReply(r);
}
}
// 댓글들은 addReply로 추가하기 // 한건씩 만들어야하기 때문에 setter로 해결이 안되기 때문
private List<Reply> replies = new ArrayList<>();
public void addReply(Reply reply) {
replies.add(reply);
}
}
package ex02;
import ex02.model.Reply;
import java.util.Arrays;
import java.util.List;
public class App2 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData2 dbData1 = new DBData2(1, "제목1", "내용1", 1, "댓글1");
DBData2 dbData2 = new DBData2(1, "제목1", "내용1", 2, "댓글2");
DBData2 dbData3 = new DBData2(1, "제목1", "내용1", 3, "댓글3");
List<DBData2> dbList = Arrays.asList(dbData1, dbData2, dbData3);
ViewData2 viewData2 = new ViewData2(dbList);
}
}
- ex01 버전이 기본임!
- board 데이터만 넣는 생성자와 reply 데이터를 넣을 컬랙션을 List로 생성
- reply_v2의 데이터를 add로 List에 추가해주기
- List에 가져온 데이터를 넣고 DB에서 가져온 데이터를 추가함
- List의 값이 null이면 터지기 때문에 if문으로 처리해주기
- List의 값을 getter로 넣어주기
- reply의 수 만큼 반복문을 돌려 List에 추가하기
package ex02_v2;
import ex02_v2.model.Reply_v2;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@NoArgsConstructor
@Data
public class ViewData_v2 {
private int boardId;
private String title;
private String content;
// Board 데이터만 넣는 생성자
public ViewData_v2(int boardId, String title, String content) {
this.boardId = boardId;
this.title = title;
this.content = content;
}
// 댓글들은 addReply로 추가하기
private List<Reply_v2> replies = new ArrayList<>();
public void addReply(Reply_v2 reply_v2){
replies.add(reply_v2);
}
}
package ex02_v2;
import ex02_v2.model.Reply_v2;
import java.util.Arrays;
import java.util.List;
public class App_v2 {
public static void main(String[] args) {
// 1. DB에서 가져온 데이터 - Flat(평평) 하게 가져올 수 밖에 없다
DBData_v2 dbData1 = new DBData_v2(1, "제목1", "내용1", 1, "댓글1");
DBData_v2 dbData2 = new DBData_v2(1, "제목1", "내용1", 2, "댓글2");
DBData_v2 dbData3 = new DBData_v2(1, "제목1", "내용1", 3, "댓글3");
List<DBData_v2> dbList = Arrays.asList(dbData1, dbData2, dbData3);
// 생성자에 디비리스트 넣고
// 2. dbList(컬렉션을) ViewData2(오브젝트)에 옮기시오 - ORM
if (dbList.size() == 0) return; // 값이 null일때 처리하기
ViewData_v2 viewData_v2 = new ViewData_v2(
//리스트에 추가하기
dbList.get(0).getBoardId(),
dbList.get(0).getTitle(),
dbList.get(0).getContent()
);
for (DBData_v2 data : dbList) { //댓글 갯수만큼 반복문 돌리기
Reply_v2 r = new Reply_v2(data.getReplyId(), data.getComment());
viewData_v2.addReply(r);
}
}
}
Share article