모델이란?
가방에 담아갈때, 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