books 테이블과 매핑됨.id, title, author, isbn, available, createdAtResultSet을 생성자에서 받아 DB 결과를 객체로 변환 가능.@Getter, @Setter, @Builder, @ToString 등@Repository로 명시된 클래스이며, DB와 직접 연결해 CRUD 수행.
기능:
save: 도서 저장updateTitleAndAuthor: 제목과 저자 수정deleteById: 도서 삭제findAll: 전체 도서 조회findById: 특정 도서 조회DataSource를 이용하여 커넥션 연결
PreparedStatement 사용으로 SQL 인젝션 방지
@SpringBootTest와 @Autowired 사용
테스트 메서드 구성: given-when-then 패턴
테스트 내용:
saveTest)updateTest)deleteTest)findAllTest)findOneTest)@RestController, @RequestMapping 사용
HTTP 메서드:
GET /api/v1/books: 전체 조회POST /api/v1/books: 도서 등록PUT /api/v1/books/{id}: 수정DELETE /api/v1/books/{id}: 삭제GET /api/v1/books/{id}: 단일 조회/book-page 요청 시 book-page.html 반환COUNT, SUM, AVG, MIN, MAXCOUNT(column)은 NULL 제외, COUNT(*)는 NULL 포함SELECT user_id, COUNT(*) AS post_count
FROM POSTS
GROUP BY user_id
HAVING COUNT(*) >= 10;
SELECT user_id, COUNT(*) AS "장문 게시물 수"
FROM POSTS
WHERE LENGTH(content) >= 30
GROUP BY user_id
HAVING COUNT(*) >= 5;
SELECT post_id, COUNT(*) AS like_count
FROM LIKES
WHERE creation_date >= TO_DATE('2024-01-01', 'YYYY-MM-DD')
GROUP BY post_id
HAVING COUNT(*) >= 20;
JdbcTemplate 없이 DataSource + PreparedStatement를 직접 다뤘고, JUnit 테스트 코드로 검증.GROUP BY, HAVING을 활용한 다양한 통계 및 필터링 쿼리를 실습함.