ORM파싱 연습하기

Feb 16, 2024
ORM파싱 연습하기

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

notion image
 

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의 정보로 구분됨
notion image
  • 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); } }
notion image
 

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
RSSPowered by inblog