본문 바로가기
개발 수업/Spring Boot

[SpringBoot] QnA게시판 질문 등록

by 오늘 하루s 2023. 8. 27.
728x90
더보기

Day82. 230825

QnA게시판 질문 등록

 

QuestionController>

package com.mycom.app.question.controller;

import com.mycom.app.question.entity.Question;
import com.mycom.app.question.repository.QuestionRepository;
import com.mycom.app.question.service.QuestionService;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/question")
@RequiredArgsConstructor
@Controller
public class QuestionController {

    private final QuestionService questionService;
    
    /*질문등록폼 보여줘 요청
    요청방식 get
    요청주소 http://localhost:포트/question/add
    모델
    view temlpates/question_detail.html */
    @GetMapping("/add")
    public String add(){
        return "question_form";
    }

    /*질문등록 처리 요청
    요청방식 post
    요청주소 http://localhost:포트/question/add
    모델
    view temlpates/question_detail.html */
    @PostMapping("/add")
    public String questionAdd(@RequestParam String subject,@RequestParam String content){
        //1.파라미터받기
        //2.비지니스로직
        //3.MOdel
        //4.View
        return "redirect:/question/list"; //(질문목록조회요청을 통한)질문목록페이지로 이동
    }



    /*질문상세조회
    */
    @GetMapping("/detail/{id}")
    public String detail(@PathVariable("id") Integer id,Model model){
        //1.파라미터받기
        //2.비지니스로직수행
        Question question = questionService.getQuestion(id);
        //3.Model
        model.addAttribute("question",question);
        //4.View
        return "question_detail"; //templates폴더하위  .html
    }

    //질문목록조회
    @GetMapping("/list")
    public String questionList(Model model){
        List<Question> questionList = this.questionService.getList();
        model.addAttribute("questionList",questionList);
        return "question_list"; //templates폴더하위 question_list문서
    }


}

 

QuestionService>

package com.mycom.app.question.service;

import com.mycom.app.exception.DataNotFoundException;
import com.mycom.app.question.entity.Question;
import com.mycom.app.question.repository.QuestionRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

@RequiredArgsConstructor
@Service
public class QuestionService {

    private final QuestionRepository questionRepository;
    //질문등록처리
    public void add(String subject,String content){
        Question question = new Question();
        question.setSubject(subject);
        question.setContent(content);
        question.setCreateDate(LocalDateTime.now());
        questionRepository.save(question);
    }

    //질문상세조회
    public Question getQuestion(Integer id){
        Optional<Question> question = questionRepository.findById(id);
        if(question.isPresent()){
            return question.get();
        }else{
            throw new DataNotFoundException("Question not Found");
        }
    }

    //질문목록조회
    public List<Question> getList(){
        List<Question> questionList = questionRepository.findAll();
        System.out.println(questionList.size());
        return questionList;
    }
}

 

QuestionRepository>

package com.mycom.app.question.repository;

import com.mycom.app.question.entity.Question;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

//Repository는 Entity에 의하여 생성된 db에 접근하여 작업하는 여러 메서드들로 구성된 interface이다.
//=>CRUD

//JpaRepository인터페이스를 상속하고 있다.
//<Repository의 대상이 되는 Entity타입,Entity타입의 PK타입>
//여기에서는 <Question,Integer> Repository의 대상이 되는 Question의 PK는 Integer
public interface QuestionRepository extends JpaRepository<Question,Integer> {

    //subject(제목)으로 Question가져오기
    Question findBySubject(String subject);

    //제목=? and 내용=?에 해당하는 Question 조회
    /*예문 : List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
    select u from User u where u.emailAddress = ?1 and u.lastname = ?2*/
    Question findBySubjectAndContent(String subject,String content);

    //질문제목에 검색키워드가 포함된 Question Entity 조회
    /*                           … where x.firstname like %?%
    Like 연산자 예문
    findByFirstnameLike         … where x.firstname like ?1
    *NotLike 연산자 예문
    findByFirstnameNotLike      … where x.firstname not like ?1 */
    List<Question> findBySubjectLike(String subject);



}

 

question_form>

<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container">
    <h5 class="my-3 border-bottom pb-2">질문등록</h5>
    <form id="questionForm" th:action="@{/question/add}" method="post">
        <div class="mb-3">
            <label for="subject" class="form-label">제목</label>
            <input type="text" name="subject" id="subject" class="form-control"/>
        </div>
        <div class="mb-3">
            <label for="content" class="form-label">내용</label>
            <textarea name="content" id="content" class="form-control" rows="8"></textarea>
        </div>
        <input type="submit" value="질문등록(처리)" class="btn btn-primary my-2"/>
    </form>
</div>
</html>

 

 

728x90