모델이란?
가방에 담아갈때, Model 로 담아갈 수도 있다. -> M (Model) VC 패턴
모델은 실질적으로 request! Model의 내부에는 request가 있다! 모델에 객체를 넣으면 뷰를 내가 들고 가줄게! 해주는 것 모델에 집어넣으면 바로 꺼내서 쓸 수 있어서,

이 request 설정을 쓰지 않아도 됨! 그치만 ? 우리는 model을 쓰지 않을 것이다. 공부가 안 됨
[ BoardNativeRepository ]
public List<Board> findAll() {
Query query = em.createNativeQuery("select * from board_tb order by id desc", Board.class);
return (List<Board>) query.getResultList(); //캐스팅 해줌 -> 생략 가능
}
join을 하면 Board.class 이런거로 못하고 DTO로 받아서 사용해야 함! 그래서 어려웠다
[ Junit 단위 테스트 하기! ]

@Import(BoardNativeRepository.class)
@DataJpaTest
public class BoardNativeRepositoryTest {
@Autowired // DI
private BoardNativeRepository boardNativeRepository;
@Test
public void findAll_test() {
//given
//when
List<Board> boardList = boardNativeRepository.findAll();
//then
System.out.println("findAll_test/size : " + boardList.size());
System.out.println("findAll_test/username : " + boardList.get(2).getUsername()); //cos인지 확인하고 싶다
}
}

[ 그런데 눈 검증만 할 수는 없다. → Assertions ]
//org.assertj.core.api
Assertions.assertThat(boardList.size()).isEqualTo(4);
Assertions.assertThat(boardList.get(2).getUsername()).isEqualTo("ssar");
[ 실패 ver. 노랑 ]


get(2)가 ssar이 아니고, size도 3이 아니라 4니까 이렇게 터진다!!
[ 성공 ver. 초록 ]

이렇게 노란색이 아니라 초록색이 나오면 성공!
[ BoardController ]
@GetMapping( "/")
public String index(HttpServletRequest request) {
List<Board> boardList = boardNativeRepository.findAll();
request.setAttribute("boardList", boardList);
return "index";
}
[ HttpServletRequest request 가방에 넣으면 좋은점 ]

알아서 버려지니까 내가 메모리 관리를 하지 않아도 됨 request는 오래 기억하지 못한다. 잠깐 가방에 담았다가 뿌리는 용도로만 사용 가능 session은 오래 기억 가능
[ index.mustache ]
{{#boardList}}
<div class="card mb-3">
<div class="card-body">
<h4 class="card-title">{{title}}</h4>
<div class="mb-3">{{createdAt}}</div>
<a href="/board/{{id}}" class="btn btn-primary">상세보기</a>
</div>
</div>
{{/boardList}}
프런트랑 일할 때는 화면에 필요한 정보만 담아서 줘야한다. 안그러면 프런트가 일을 못한다. 즉, 실제로 줘야 하는 건 Board 객체의 필드 전부가 아니다. content, username 이런건 다 안 들어감. 필요 없음! (객체 복사를 해야함 !)
→ 그래서 화면용 DTO가 필요!

시간까지 나오는거 너무 안 예쁘다. → Getter만 커스터마이징 하면 된다.
게시글 목록보기에 시간 출력하기
1. 라이브러리 넣기
implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.0'
서버 끄고! 라이브러리 추가!
2. 날짜를 예쁘게 포맷할 수 있는 util 만들기

로직을 test코드에서 짜고, 완성된 로직을 집어넣자!! 꼭! 바로 짜지 마라!
package shop.mtcoding.blog.util;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.junit.jupiter.api.Test;
import java.sql.Timestamp;
import java.util.Date;
public class DateTest {
@Test
public void format_test(){
Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
// Timestamp를 Date 객체로 변환
Date currentDate = new Date(currentTimestamp.getTime());
// 원하는 포맷으로 날짜를 변환
String formattedDate = DateFormatUtils.format(currentDate, "yyyy-MM-dd HH:mm");
// 포맷된 날짜 출력
System.out.println("Formatted Date: " + formattedDate);
}
}
코드 직접 테스트
MyDateUtil

public class MyDateUtil {
//timestamp를 포맷할거
public static String timestampFormat(Timestamp time) {
Date currentDate = new Date(time.getTime());
return DateFormatUtils.format(currentDate, "yyyy-MM-dd HH:mm");
}
}
static 이어야 뜸
timestampFormat 테스트 코드 돌려보기
public class DateTest {
@Test
public void timestampFormat_test() {
//given
Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
//when
String cratedAt = MyDateUtil.timestampFormat(currentTimestamp);
//then
System.out.println("timestampFormat_test : " + cratedAt);
}

메스드 테스트. 이제 잘 돌아가는 걸 확인했으니 활용하자 !
Board
@Data
@Table(name = "board_tb")
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
private String username;
private Timestamp createdAt;
public String getTime() {
return MyDateUtil.timestampFormat(createdAt);
}
}
재사용할 수 있게 getTime 메소드
time이라는 변수가 없는데, 머스태치에 꺼내서 쓸 때 time 이라고 하면 된다 ..?
index 머스태치 수정

애는 변수가 아니라 getter 다!!!


화면 확인

Share article