게시물 전체 조회
HTTP메서드 : GET
Endpoint URL : /api/posts
작업 내용 : 전체 게시물 조회
전체 조회는 저장된 데이터를 한꺼번에 가져와 클라이언트에 반환하는 작업이다
데이터를 저장하고 조회하는 구조는 리스트(List), 맵(Map), 배열(Array) 등이 사용된다.
스프링 어노테이션과 JPA를 사용하기전에 순수 JAVA 문법과 DB에 대해 알아보자.
요구사항
- 전체 게시물 데이터 반환:
- ID, 제목, 내용, 작성일 등의 정보를 포함한 모든 게시물을 반환.
- 결과는 JSON 형식으로 출력.
- 효율적 데이터 조회:
- 데이터가 많을 경우 페이징 기능을 고려.
개념정리
데이터를 다루기 위해 클래스를 정의하고 객체를 생성해야 한다.
게시물 데이터를 표현하기 위한 Post 클래스
여러 데이터를 저장하고 관리하기 위해 List, Map 등의 컬렉션을 사용.
- 전체 게시물 데이터를 List<Post>로 관리
코드설명
Java에서는 전체 조회를 위해 컬렉션 프레임워크를 주로 사용
import java.util.ArrayList;
import java.util.List;
class Post {
private Long id;
private String title;
private String content;
// 생성자
public Post(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
// getter 메서드
public Long getId() {
return id;
}
public String getTitle() {
return title;
}
public String getContent() {
return content;
}
}
public class Main {
public static void main(String[] args) {
// 데이터 저장
List<Post> posts = new ArrayList<>();
posts.add(new Post(1L, "Post 1", "This is the first post."));
posts.add(new Post(2L, "Post 2", "This is the second post."));
posts.add(new Post(3L, "Post 3", "This is the third post."));
// 전체 조회
for (Post post : posts) {
System.out.println("ID: " + post.getId());
System.out.println("Title: " + post.getTitle());
System.out.println("Content: " + post.getContent());
System.out.println("------------------------");
}
}
}
JDBC로 전체 조회
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class PostRepositoryJDBC {
private static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String USER = "root";
private static final String PASSWORD = "password";
public List<Post> findAllPosts() {
List<Post> posts = new ArrayList<>();
String query = "SELECT id, title, content, created_at FROM posts";
try (
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement statement = connection.prepareStatement(query);
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
Post post = new Post(
resultSet.getLong("id"),
resultSet.getString("title"),
resultSet.getString("content"),
resultSet.getString("created_at")
);
posts.add(post);
}
} catch (SQLException e) {
e.printStackTrace();
}
return posts;
}
}
MyBatis를 사용한 전체 조회
MyBatis는 SQL을 XML로 분리하여 관리하고, Java 객체와 SQL 결과를 자동으로 매핑.
XML Mapper:
<mapper namespace="PostMapper">
<select id="findAllPosts" resultType="Post">
SELECT id, title, content, created_at FROM posts
</select>
</mapper>
Repository 인터페이스:
public interface PostMapper {
List<Post> findAllPosts();
}
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class PostRepositoryMyBatis {
private SqlSessionFactory sqlSessionFactory;
public PostRepositoryMyBatis(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public List<Post> findAllPosts() {
try (SqlSession session = sqlSessionFactory.openSession()) {
PostMapper mapper = session.getMapper(PostMapper.class);
return mapper.findAllPosts();
}
}
}
JPA를 사용한 전체 조회
JPA는 엔티티(Entity)를 정의하고, 데이터베이스와의 매핑을 자동으로 처리.
Entity 클래스
import jakarta.persistence.*;
@Entity
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String content;
private String createdAt;
// Getters and Setters
}
Repository 인터페이스
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostRepository extends JpaRepository<Post, Long> {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PostService {
@Autowired
private PostRepository postRepository;
public List<Post> findAllPosts() {
return postRepository.findAll();
}
}
개발중 생길 수 있는 기본적인 의문들
Q: 전체조회에 필수적으로 추가되는 기능은 어떤것들이 있는지?
A:
- 페이징 (Pagination)데이터가 많아질 경우 성능과 클라이언트 경험을 고려해 페이징 처리 필요
- JDBC: SQL에 LIMIT와 OFFSET 추가.
- MyBatis: SQL 쿼리에 페이징 변수 포함.
- JPA: Pageable 객체 사용.
- 정렬 (Sorting)특정 기준으로 데이터를 정렬(예: 최신순, 인기순 등)
- JDBC: SQL에 ORDER BY 추가.
- JPA: Sort 객체로 동적 정렬 가능.
- 검색 (Search)제목, 내용, 작성자 등 특정 필드를 기준으로 검색
- JDBC: WHERE 조건 추가.
- JPA: 메서드 쿼리(findByTitleContaining) 또는 @Query 사용.
'기능이해' 카테고리의 다른 글
[JAVA | SPRING | MVC | CRUD] 게시물 수정 Update (2) | 2024.12.08 |
---|---|
[JAVA | SPRING | MVC | CRUD] 게시물 단건조회 (0) | 2024.09.28 |
[JAVA | SPRING | MVC | CRUD] 게시물 작성 CREATE (0) | 2024.09.05 |