Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 그리디
- Android
- pointcut
- jpa
- db
- SpringBoot
- http
- 인프런
- 스프링 핵심 원리
- Spring Boot
- Greedy
- 알고리즘
- 스프링
- Thymeleaf
- 김영한
- JDBC
- 백준
- 자바
- AOP
- Servlet
- Exception
- 스프링 핵심 기능
- JPQL
- transaction
- spring
- kotlin
- QueryDSL
- java
- Proxy
- springdatajpa
Archives
- Today
- Total
개발자되기 프로젝트
검색기능 추가 및 view 정비 본문
1. 검색기능 추가
- 먼저 가장 간단한 방식인 제목 검색을 추가하자.
- posts 화면에서 검색어를 입력하면 해당 글만 보여주고 싶다.
1.1 SearchForm
- HTML Form에서 사용할 객체이다.
- keyword에 검색어를 담을 예정.
@Data
public class SearchForm {
String keyword;
public SearchForm(String keyword) {
this.keyword = keyword;
}
public SearchForm() {
}
}
1.2 PostController
- 글 전체 목록 요청이 올 때 Model에 빈 SearchForm객체를 넘기자.
- 그러면 HTML Form에서 th:object를 활용이 가능하다.
- search()메서드에서 view에서 넘어온 keyword파라미터를 @RequestParam을 통해 바인딩한다.
- 해당 keyword로 poserService의 findByTitleContaints()를 호출한다. 이후 결과를 "posts"에 담고
- view에서 랜더링.
@GetMapping
public String posts(Model model, HttpServletRequest request) {
MemberDto loginMemberDto = getLoginMember(request);
List<Post> posts = postService.findAll();
List<PostDto> postsDto = getPostDtos(posts);
model.addAttribute("member", loginMemberDto);
model.addAttribute("posts", postsDto);
model.addAttribute("searchForm", new SearchForm());
return "post/posts";
}
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword, Model model, HttpServletRequest request){
log.info("keyword: {}", keyword);
MemberDto loginMemberDto = getLoginMember(request);
List<Post> posts = postService.findByTitleContains(keyword);
List<PostDto> postsDto = getPostDtos(posts);
model.addAttribute("member", loginMemberDto);
model.addAttribute("posts", postsDto);
model.addAttribute("searchForm", new SearchForm(keyword));
model.addAttribute("status", status);
return "post/posts";
}
1.3 PostService, Repository
- 넘어온 keyword를 받아 쿼리를 날린다.
- 제목에 keyword를 포함하는 엔티티를 찾기 위한 목적임.
@Override
public Optional<List<Post>> findByTitleContains(String keyword) {
String query = "%"+keyword+"%";
log.info("query: {}", query);
return Optional.ofNullable(
em.createQuery("select p from Post p where p.title like :keyword", Post.class)
.setParameter("keyword", query)
.getResultList());
}
1.4 Posts.html
- Model에 담겨 넘어온 searchForm 객체를 th:object를 통해 활용.
- input 에 th:field="*{keyword}"를 지정했는데, input에 입력한 값이 QueryParam으로 넘어간다.
- ~~~?keyword=input
<form action="posts.html" th:action="@{/posts/search}" th:object="${searchForm}" method="get">
<div class="input-group mb-3">
<input type="text" class="form-control" th:field="*{keyword}" placeholder="검색어" aria-label="Recipient's username" aria-describedby="button-addon2">
</div>
</form>
2. view 정비
- 페이지가 너무 지저분해서... 정리좀 했다. ㅋㅋㅋ
3. 결과
- 홈 화면
- 회원가입
- 로그인 화면
- 로그인 홈 화면
- 글 목록
- 글 상세 페이지
- 글 검색
4. 앞으로..
est용 data 서버시작할 때 DB에 올리기Listener
createdAt, updatedAt등
게시글에 작성자 표시- view 정리
게시글 검색- 검색 옵션 추가 : 작성자, 제목 구분
- 영속성 전이 설정
- 댓글 삭제 버튼
- 대댓글
- 검증 & 예외처리
- 회원 가입시 필수 정보 지정.
- 데이터 타입 지정
- 인증처리
- 로그인한 사용자만 글 & 댓글 작성 가능.
- 본인이 작성한 글, 댓글만 삭제 가능
- 관리자는 모든 권한
- 예외처리
- 페이징 처리
- 컬렉션 조회 최적화
5 GitHub: 211008 upgrade view, add search Function
'Project > 블로그 게시판 만들기' 카테고리의 다른 글
회원 탈퇴하기 (0) | 2021.10.09 |
---|---|
글 삭제하기, cascade, orphanRemoval, 영속성 전이 (0) | 2021.10.09 |
Listener, Formatter 사용 (0) | 2021.10.07 |
글 상세 페이지에 작성자 추가 (0) | 2021.10.07 |
Test용 데이터 추가 (0) | 2021.10.07 |
Comments