TIL - 20250723

juni·2025년 7월 23일

TIL

목록 보기
72/317

0723 학습내용 정리

📘 도서 관리 시스템 (Spring Boot 기반 CRUD 구현)

1. Book Entity

  • Book 클래스는 DB의 books 테이블과 매핑됨.
  • 주요 필드: id, title, author, isbn, available, createdAt
  • ResultSet을 생성자에서 받아 DB 결과를 객체로 변환 가능.
  • Lombok의 어노테이션 사용: @Getter, @Setter, @Builder, @ToString

2. BookRepository (데이터 접근 계층)

  • @Repository로 명시된 클래스이며, DB와 직접 연결해 CRUD 수행.

  • 기능:

    • save: 도서 저장
    • updateTitleAndAuthor: 제목과 저자 수정
    • deleteById: 도서 삭제
    • findAll: 전체 도서 조회
    • findById: 특정 도서 조회
  • DataSource를 이용하여 커넥션 연결

  • PreparedStatement 사용으로 SQL 인젝션 방지

3. BookRepositoryTest (JUnit 테스트)

  • @SpringBootTest@Autowired 사용

  • 테스트 메서드 구성: given-when-then 패턴

  • 테스트 내용:

    • 저장 테스트 (saveTest)
    • 수정 테스트 (updateTest)
    • 삭제 테스트 (deleteTest)
    • 전체 조회 테스트 (findAllTest)
    • 개별 조회 테스트 (findOneTest)

4. BookController (REST API 컨트롤러)

  • @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}: 단일 조회

5. BookRouteController (타임리프 연결용)

  • HTML 페이지 연동을 위한 단순 포워딩 컨트롤러
  • /book-page 요청 시 book-page.html 반환

📊 SQL 실습 - 집계 함수 및 그룹 함수

1. 기본 집계 함수

  • COUNT, SUM, AVG, MIN, MAX
  • COUNT(column)은 NULL 제외, COUNT(*)는 NULL 포함

2. GROUP BY와 HAVING

  • 사용자별 피드 개수, 게시물 타입별 개수 등을 조회할 때 사용
SELECT user_id, COUNT(*) AS post_count
FROM POSTS
GROUP BY user_id
HAVING COUNT(*) >= 10;

3. WHERE 조건과 결합

  • 조건 필터링 후 그룹핑 가능
SELECT user_id, COUNT(*) AS "장문 게시물 수"
FROM POSTS
WHERE LENGTH(content) >= 30
GROUP BY user_id
HAVING COUNT(*) >= 5;

4. 서브쿼리 활용 예시

  • 좋아요가 20개 이상인 게시물
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;

✅ 요약

  • Spring Boot를 이용한 CRUD 기능 구현 방법을 학습했으며, 엔티티 → 레포지토리 → 컨트롤러 구조로 설계.
  • JdbcTemplate 없이 DataSource + PreparedStatement를 직접 다뤘고, JUnit 테스트 코드로 검증.
  • SQL에서는 집계 함수와 GROUP BY, HAVING을 활용한 다양한 통계 및 필터링 쿼리를 실습함.

0개의 댓글