Springboot

Springboot CRUD게시판 - select

colin2 2024. 2. 20. 11:28

자, 이제 본격적으로 데이터베이스를 활용하여 테이블의 결과를 띄워볼 것이다.

 

그러기 위해서 이전에 pom.xml에 추가해 두었던 오라클 DB에 테이블과, idx로 사용할 시퀀스도 하나씩 생성했다.

 

 

아주 기본적인 '방명록'으로 CRUD를 먼저 진행할 것이다.

 

select를 먼저 만들 것이기 때문에 확인을 위해 미리 레코드 하나를 추가했다.

 

잊지 말고 commit을 해준 뒤, 잘 저장이 되었는지 확인 후 프로젝트 작업을 시작했다.

 

우선 springboot에 project 패키지, 그 안에 guestbook 패키지를 생성해준다.

 

그 안에 데이터베이스에 있는 값을 활용하기 위한 GuestbookVO.java를 추가해주고, lombok의 @Data를 사용해준다.

 

@Data의 자세한 설명은 Chat-GPT가 해주었다.

 

@Data는 Lombok 라이브러리에서 제공하는 어노테이션 중 하나입니다. 이 어노테이션을 사용하면 자바 클래스에서 일반적으로 작성해야 하는 메서드들을 자동으로 생성해줍니다. 주로 데이터 객체를 정의할 때 편리하게 사용됩니다.

 

@Data 어노테이션은 다음과 같은 기능을 수행합니다:

  1. Getter/Setter 메서드 생성: 클래스 내의 각 필드에 대한 getter 및 setter 메서드를 생성합니다.
  2. toString 메서드 생성: 객체의 문자열 표현을 반환하는 toString 메서드를 생성합니다.
  3. equals 및 hashCode 메서드 생성: 객체 간의 동등성 비교를 위한 equals 및 hashCode 메서드를 생성합니다.
  4. 기본 생성자 생성: 매개변수 없는 기본 생성자를 생성합니다.

 

다음으로 GuestbootDao.java를 추가하여 @Mapper를 잡아주고, getGuestbookList라는 이름으로 guestbook 테이블의 레코드들을 받을 메서드를 만들어 준다.

현재는 전체 레코드를 받아올 것이고 검색 등을 하지 않기 때문에 매개변수가 없어도 되지만, 추후에 검색 받아올 값이 생기면 vo에 추가하여 처리하기 위해 우선 vo를 받는 것으로 처리하였고, 전체 레코드를 받아올 것이기 때문에 List로 리턴을 잡았다.

 

이제 GuestbookDao와 연결하기 위해 src -> main -> resources에 mappers 패키지를 추가하여 guestbook-mapper.xml 파일을 생성한 뒤, guestbook의 레코드를 가져오기 위한 select 문을 작성해 준다.

Dao와 mapping할 것이고, 메서드의 이름은 getGuestbookList, 파라미터타입과 리턴하는 레코드들은 모두 vo의 형태이므로 알맞게 type을 잡아준다.

 

다음으로 GuestbookService.java 인터페이스를 생성하여 상속할 준비를 하고,

 

GuestbookServiceImpl.java 클래스를 생성하여 @Service를 잡아주고, GuestbookDao를 @Autowired로 자동으로 연결해준 뒤, GuestbookService를 implements 해준다.

 

다음으로 이전에 생성한 controller 패키지에 GuestbookController.java를 추가하여 @Controller를 잡아주고, GuestbookService를 자동 연결해준 뒤, getGuestbookList.do가 불렸을 때 처리할 내용과 리턴할 것을 추가한다.

getGuestbookList에서 현재 받을 vo(매개변수)는 없기 때문에 null인 상태이고, 이 결과값을 "li"라는 이름에 담아 model에 추가해준다.

 

이제 이전에 top.jsp 파일에 추가해둔 목록보기를 클릭하면,

 

getGuestbookList.do로 이동할 것이고, model에 있는 값은 guestbook의 getGuestbookList.jsp에서 li라는 이름으로 사용할 수 있게 되었다.

 

여기에서 받아온 li의 값을 jstl로 사용하기 위해 상단에 코드를 추가해 주었고, 함수를 사용하기 위해 fn도 추가했다.

 

역시 자세한 설명은 Chat-GPT가 해준다.

 

  1. <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>: 이 지시어는 JSTL(JavaServer Pages Standard Tag Library)의 "core" 태그 라이브러리를 현재 JSP 페이지에서 사용하겠다고 선언합니다. uri 속성은 사용할 태그 라이브러리의 위치를 지정하며, prefix 속성은 해당 라이브러리의 접두사(prefix)를 정의합니다. 이 태그 라이브러리는 JSP에서 반복문, 조건문 등을 편리하게 사용할 수 있도록 다양한 기능을 제공합니다.
  2. <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>: 이 지시어는 JSTL의 "functions" 태그 라이브러리를 현재 JSP 페이지에서 사용하겠다고 선언합니다. 마찬가지로 uri 속성은 라이브러리의 위치를, prefix 속성은 라이브러리의 접두사를 정의합니다. "functions" 태그 라이브러리는 다양한 함수들을 제공하여 문자열 조작, 컬렉션 조작 등을 간편하게 수행할 수 있도록 돕습니다.

 

forEach를 활용하여 li에 담겨있는 레코드들을 record에 담아 하나씩 뿌려준다.

 

또한, 메모의 길이가 너무 길어지는 것을 방지하기 위해 아까 추가해준 fn을 활용하여, String인 memo의 length를 확인, 메모의 길이가 10을 초과하면 ...으로 줄임 표시가 된 것 처럼 보이게 해주고, 그렇지 않으면 그대로 보일 수 있도록 해주었다.

 

그리고 날짜 역시 substring을 활용하여 시간까지 표시되지 않도록 해주었는데, 길이를 확인하지 않고 그냥 끊어줄 것이기 때문에 fn을 활용하지는 않고 자릿수로 처리했다.

 

추가로 insert를 위한 guestbookForm.do로 이동하기 위한 글쓰기 버튼을 추가해주었고, 이름을 클릭하면 해당 레코드를 상세보기 할 수 있도록 getGuestbook.do 링크까지 미리 잡아주었다.

 

이제 목록보기를 클릭하면 guestbook 테이블에 있는 레코드가 모두 출력되는 것을 볼 수 있다.

 

이렇게 select 작업이 완료되었고, 아래 사진은 지금까지 추가한 프로젝트의 경로이다.

 

다음 작업은 테이블에 레코드를 추가하기 위한 insert이다.