[Spring Boot] 게시물 사이트 제작하기 (3) - repository, service / DB 연동하여 사용 (create, list, detail)

김광일·2024년 9월 10일
0

SpringBoot

목록 보기
6/19
post-thumbnail

<간단 복습>
DAO에서 자동으로 처리하려면 Repository의 경우에는 Entity라는 게 필요하다.

Entity가 존재하면 DB에 하나의 Table이 생성이 된다.

Entity에서 키값을 구별하기 위해 Primary-key가 필요하고, 이 부분을 @Id를 가지고 지정할 수 있다.


1. Repository, Service 생성

[1] Repository

1) 패키지 생성

src/main/java/com/example/demo/repository 경로로 생성

2) BoardRepository.java 생성

package com.example.demo.repository;

import com.example.demo.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
	public interface BoardRepository extends JpaRepository<Board, String> {
}

3) 그냥 정리한거 (나중에 다시 정리하가)

회원관리 CRUD
JDBC가 없는 것이 아니라 JPA가 내부적으로 JDBC를 실행시키는 것임
save() : Entity등록 혹은 수정 레코드 저장 (insert, update)
repository.save(Entity)
두 가지 의미가 있음 → 둘 중 하나를 선택할 수 있음
insert into 테이블 values();
update 테이블 set where Id=?;
findOne(): primary key로 레코드 한 건 찾기
fineAll()
select from 테이블;
전체 레코드 조회
findById()
select
from 테이블 where id=?; 상세조회(회원, 상품, 게시글)
delete(Object Entity): Entity 삭제
delete from where ;
count(): 전체 엔티티의 개수를 리턴함
existsById()
이렇게 실행된 코드를 보이게 하는 것이 Hibernate에서 설정할 수 있음
이 외의 메소드들은 여기서 확인이 가능하다. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories

[2] Service

1) 패키지 생성

src/main/java/com/example/demo/service 경로로 생성

2) BoardService.java 생성

: 파일 생성 후 [1. 함수선언] create 함수 선언

package com.example.demo.service;

import com.example.demo.domain.Board;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public interface BoardService {
    Board createBoard(Map<String, Object> params);
}

3) impl 패키지 생성

src/main/java/com/example/demo/service/impl 경로로 생성

4) BoardServiceImpl.java 생성

: 파일 생성 후 [2. 함수구현] crcreateBoard 함수 override하고 기능 구현

package com.example.demo.service.impl;

import com.example.demo.domain.Board;
import com.example.demo.service.BoardService;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class BoardServiceImpl implements BoardService {
    @Override
    public Board createBoard(Map<String, Object> params) {
        System.out.println("Success");
        return null;
    }
}

2. Create 변경하기

[1] Create (구조 변경)

1) creat.html 파일 변경

(1) 순번에 대한 label / input 추가하기
순번
<input type = "text" id = "create_board_id"/>
제목
<input type = "text" id = "create_board_title"/>
내용
<input type = "text" id = "create_board_content"/>
작성자
<input type = "text" id = "create_board_author"/>
(2) create_board function에서 id 내용 추가
function create_board(){
        $.ajax({
            url : "/api/board/create",
            type : "GET",
            contentType : 'application/json; charset=utf-8',
            data : {
                id : $("#create_board_id").val(),
                title : $("#create_board_title").val(),
                content : $("#create_board_content").val(),
                author : $("#create_board_author").val()
            },
            cache : false,
            success : (obj_data, status, xhr) => {
                alert(JSON.stringify (obj_data));
            },
            error: (obj_data, status, error) => {
                alert("error!!");
                alert(JSON.stringify(obj_data));
            }

        })
    }

2) BoardServiceImpl.java

1) 생성자, 변수 추가하기
public class BoardServiceImpl implements BoardService {

    private final BoardRepository boardRepository;

    public BoardServiceImpl(BoardRepository boardRepository){
        this.boardRepository = boardRepository;
    }
    .
    .
    .
}
2) createBoard 수정하기

: [2. 함수구현] crcreateBoard 함수 override하고 기능 구현

@Service
public class BoardServiceImpl implements BoardService {

    private final BoardRepository boardRepository;
    public BoardServiceImpl(BoardRepository boardRepository){
        this.boardRepository = boardRepository;
    }
    @Override
    public Board createBoard(Map<String, Object> params) {
        System.out.println("Success");
        Board board = new Board();
        board.setId(Integer.parseInt(params.get("id") + ""));
        board.setTitle(params.get("title").toString());
        board.setContent(params.get("content").toString());
        board.setAuthor(params.get("author").toString());

        boardRepository.save(board);
        return null;
    }
}

[2] 결과 화면


3. 전체 List 불러오기 변경하기

[1] List 전체 불러오기

1) BoardService.java 수정하기

: [1. 함수선언] listboard 함수 선언

public interface BoardService {
    Board createBoard(Map<String, Object> params);
    List<Board> listboard();
}

2) BoardServiceImpl.java 수정하기

: [2. 함수구현] listboard 함수 override하고 기능 구현

@Override
public List<Board> listboard() {
    return boardRepository.findAll();
}

3) list.html 파일 수정하기

: a 태그의 order를 id로 수정하기

<script>
    function list_board(){
        $.ajax({
            url : "/api/board/list",
            type : "GET",
            contentType : 'application/json; charset=utf-8',
            data : {},
            cache : false,
            success : (obj_data, status, xhr) => {
                alert(JSON.stringify(obj_data));
                for(let each of obj_data){
                    $("#div_list_board").append("<a href = '/board/detail/" + each["id"] + "'>" + each["id"] + "//" + each["title"] + "<br/>" + "<a/>");
                }
            },
            error: (obj_data, status, error) => {
                alert("error!!");
                alert(JSON.stringify(obj_data));
            }

        })
    }

</script>

4) BoardRestController.java 내용 수정하기

: service에서 제공하는 listboard로 기능 제공하게끔 수정.

    @GetMapping({"/list"})
    public List<Board> list() {

        return boardService.listboard();
    }

[2] 결과 화면


4. Detail 변경하기

[1] Detail 변경하기

1) BoardService.java 수정하기

: `[1. 함수선언] detailBoard 함수 선언

@Service
public interface BoardService {
    Board createBoard(Map<String, Object> params);
    List<Board> listboard();

    Board detailBoard(Integer id);
}

2) BoardServiceImpl.java 수정하기

: [2. 함수구현] detailBoard 함수 override하고 기능 구현`

    @Override
    public Board detailBoard(Integer id){
        return boardRepository.findById(id).orElse(null);  // 단일 엔티티 조회 시 findById 사용
    }

3) BoardRepository.java 수정하기

: primary key인 id값이 String으로 되어 있던 것을 Integer로 수정

package com.example.demo.repository;

import com.example.demo.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface BoardRepository extends JpaRepository<Board, Integer> {

}

3) deatil.html 파일 수정하기

(1) input의 id name

: detail_boear_id로 변경

<input type = "text" id = "detail_board_id" readonly/>
<input type = "text" id = "detail_board_title"/>
<input type = "text" id = "detail_board_content"/>
<input type = "text" id = "detail_board_author"/>
(2) detail_board()

: order -> id로 변경하기 (이는 id값을 data로 담아서 api 호출하는 용도임)
: alert / val() 지정하는 부분에서 object 배열 내용 수정하기

function detail_board(){
        $.ajax({
            url : "/api/board/detail",
            type : "GET",
            contentType : 'application/json; charset=utf-8',
            // data : { order : $("#detail_board_order").val()},
            data : { id : final_id},
            cache : false,
            success : (obj_data, status, xhr) => {
                console.log(JSON.stringify(obj_data));

                // alert(obj_data["resultCode"]);
                alert(obj_data["id"]);
                alert(obj_data["title"]);
                alert(obj_data["content"]);
                alert(obj_data["author"]);

                // $("#detail_board_title").val(obj_data.order); // 이렇게도 표현 가능
                $("#detail_board_id").val(obj_data["id"]);
                $("#detail_board_title").val(obj_data["title"]);
                $("#detail_board_content").val(obj_data["content"]);
                $("#detail_board_author").val(obj_data["author"]);

            },
            error: (obj_data, status, error) => {
                alert("error!!");
                alert(JSON.stringify(obj_data));
            }

        })
    }

4) BoardRestController.java 내용 수정하기

: service에서 제공하는 listboard로 기능 제공하게끔 수정.

    @GetMapping({"/detail"})
    public Board detail(@RequestParam Integer id) {
        System.out.println("id : " + id);
        return boardService.detailBoard(id);
    }

[2] 결과 화면

profile
안녕하세요, 사용자들의 문제 해결을 중심으로 하는 프론트엔드 개발자입니다. 티스토리로 전환했어요 : https://pangil-log.tistory.com

0개의 댓글