| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 공부
- findBy
- API
- 보안
- Method 방식
- AJAX
- 분리 개발
- SpringBoot
- js
- 취미
- 유효성 검사
- HttpOnly
- 낙서
- security
- VS Code
- Security 설정
- 웹
- login
- MockAPI
- IntelliJ
- 웹개발
- 로그인
- 자바 스크립트
- 시
- ES6+
- @AuthenticationPrincipal
- 카카오
- JavqScript
- 백틱
- 그림
- Today
- Total
개발가능구역
[ IntelliJ ] Spring Boot 검색 기능 ( 쿼리 사용 or 자동 쿼리 ) 본문

사용 클래스 : Controller, Service, DTO, Entity
사용 인터페이스 : Service 구현, Repository
사용 DB : ORACLE
UI : HTML, Thymeleaf
전체 흐름
1. testsearch(검색할 내용), title(DB 컬럼명) 2. Controller에서 검색 value값을 Service로 전달 3. Service에 Repository로 전달하여 value 값을 DB와 비교 4. Controller에 반환 값을 전달 5. (임시)페이지 수는 1로 한정하여 UI 구현 |
UI
<div>
<h2>TEST SEARCH</h2>
<form action="test02search" method="get">
<div>
<input type="text" name="testsearch" id="testsearch" placeholder="제목을 입력해주세요.">
<button type="submit">검색</button>
</div>
</form>
</div>
<input>을 통해 testsearch라는 변수에 검색값을 넣어두고 <button> 에 submit 타입으로 전송.
placeholder = " " : 검색창 안에 회색 글자
<form>으로 Controller로 보내줬다.
Method = " GET / POST " 의 차이
1. method = "GET" / 조회(Read) : 검색, 페이지 이동 같은 단순 조회
2. method = "POST" / 생성(Create), 수정(Update), 삭제(Delete) : 글쓰기, 로그인, 회원가입, 삭제처럼 DB에 영향 주는 요청
검색은 조회(Read)이니 GET 방식을 사용했다.
Controller
@GetMapping(value = "/test02search")
public String search02(@RequestParam("testsearch") String testsearch,
Model mo){
List<Test02Entity> list = service02.titleSearch(testsearch);
mo.addAttribute("list", list);
mo.addAttribute("totalPages", 1);
mo.addAttribute("currentPage", 1);
return "test02output";
}
@RequestParam(" ")으로 검색한 값이 들어간 변수를 가져온다.
이제 이 값을 Service → Repository 방향으로 넘겨주고, Repository에서 쿼리를 사용해 검색 데이터를 찾아볼 것이다.
후에 찾아온 데이터를 Model 방식으로 list변수에 셋팅한다.
totalPages = 1, currentPage = 1을 대입하여 같이 보낼건데, 이는 검색 페이지 수가 1개만 나오게 하기 위해서이다.
Service 구현
@Override
public List<Test02Entity> titleSearch(String testsearch) {
return repository.findTitle(testsearch);
}
단순히 통로처럼만 사용했음
Repository
public interface Test02Repository extends JpaRepository<Test02Entity, Long> {
@Query(value = "SELECT * FROM testtable02 " +
"WHERE title LIKE '%' || :testsearch || '%'", nativeQuery = true)
List<Test02Entity> findTitle(@Param("testsearch") String testsearch);
}
쿼리문을 사용해서 검색한 값을 찾아서 반환할 것이다.
Where
1. LIKE를 사용하여 검색어(문자열)을 비교한다. 2. || : 문자열을 이어붙이는 연산자, 좀 더 동적으로 바꿔줌. (Oracle에서는 필수) 3. :testSearch 에 콜론( : ) - @Param하고 연관되는데 자바 코드에서 전달된 값을 매핑하는 방식이다. - 좀 더 안전성(보안)이 있고, 가독성이 좋아진다고 한다. |
findBy...
위에서 Repository에 LIKE(문자열 비교)를 사용한 쿼리문을 사용했지만
이번에는 쿼리문을 안 쓰는 쿼리 자동 생성 방식이다.
특징
1. finBy 작성 후에 한 단어?가 끝날 때마다 대문자로 작성해야 인식 가능. 2. 한 단어?로 표현해야 하기 때문에 가독성이 많이 떨어짐. 3. 쓸 줄 알면 편하긴 함. |
주요 키워드 정리
1. Containing : LIKE %keyword% - 키워드를 포함한 모든 내용이 출력됨. 2. StartingWith : LIKE keyword% - 키워드로 시작되는 모든 내용이 출력됨. 3. EndingWith : LIKE %keyword - 키워드로 끝나는 모든 내용이 출력됨. 4. IgnoreCase : 대소문자 구분 없음. - 대소문자를 구분한다면 A or a 를 구분해서 정확하게 찾겠지만 구분 안 하는 건 A와 a를 동일하게 본다는 것. 5. And, Or : 조건 연결 - And 는 모두 참이여야하고, Or 은 하나만 참이면 됨. 6. Between, LessThan, GreaterThan : 범위 검색 - Between : BETWEEN . . . AND . . . - LessThan : findByTimeLessThan( 숫자값변수 ) = 변수보다 작은 데이터 값을 가져 온다. ( < ) - GreaterThan : findByTimeGreaterThan( 숫자값변수 ) = 변수보다 큰 데이터 값을 가져 온다. ( > ) 7. OrderBy . . . DESC / ASC : 정렬 |
이제 연습으로 위에서 했던 내용을 쿼리문 사용 → 자동 쿼리 로 바꿔보자.
Service
@Override
public List<Test02Entity> titleSearch(String testsearch) {
return repository.findByTitleContainingIgnoreCase(testsearch);
}
1. findBy : 시작
2. Title을 기준으로
3. Containing : 키워드를 포함한 모든 내용을 찾고 싶음( % keyword % )
4. IgnoreCase : 대소문자 구분하지 않고
Repository
List<Test02Entity> findByTitleContainingIgnoreCase(String testsearch);
앞전에 있던 @Query를 없앴지만
자동 쿼리문을 생성했기 때문에 문제 없이 돌아가게 된다.
이제 출력을 해보면

꾸미는 건 다음으로..!
'SpringBoot > IntelliJ' 카테고리의 다른 글
| [ IntelliJ ] Spring Security 로그인 01 (0) | 2025.09.30 |
|---|---|
| [ IntelliJ ] JavaScript 활용 유효성 검사 ( 전화번호 ) (0) | 2025.09.29 |
| [ IntelliJ ] SpringBoot JavaScript 활용 유효성 검사 ( 비밀번호 확인 ) (2) | 2025.09.27 |
| [ IntelliJ ] Validation 유효성 검사 (4) | 2025.09.26 |
| [ IntelliJ ] Spring boot 페이징 처리하기 (0) | 2025.09.24 |