Spring Boot + Angular + Oracle, Rest API 쇼핑몰 _ 박수연

Spring 

package shop.park;


import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.CrossOrigin;

import org.springframework.web.bind.annotation.DeleteMapping;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.PutMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.util.UriComponentsBuilder;


import shop.kim.login.service.LoginService;

import shop.park.model.Faq;

import shop.park.model.Notice;

import shop.park.model.Products;

import shop.park.model.Qna;

import shop.park.service.FaqServiceImpl;

import shop.park.service.NoticeServiceImpl;

import shop.park.service.ProductServiceImpl;

import shop.park.service.QnaServiceImpl;


@RestController

@RequestMapping(value = "/toma")

@CrossOrigin(origins = "*")

public class MainController {


@Autowired

ProductServiceImpl productService;

@Autowired

NoticeServiceImpl noticeService;

@Autowired

FaqServiceImpl faqService;

@Autowired

QnaServiceImpl qnaService;

@Autowired

LoginService loginService;


public static final Logger log = LoggerFactory.getLogger(MainController.class);


// 상품 관련 controller

@RequestMapping(value = "", method = RequestMethod.GET)

public List<Products> listAllProducts() {

log.info("Select All Products");


List<Products> productsList = productService.selectAllProducts();


return productsList;

}


@RequestMapping(value = "/product/{p_kind}", method = RequestMethod.GET)

public List<Products> getByProductsKind(@PathVariable("p_kind") String p_kind) {

log.info("Select Products by p_kind");


List<Products> productsKindList = productService.selectByProductKind(p_kind);


return productsKindList;

}


@RequestMapping(value = "/detail/product/{p_code}", method = RequestMethod.GET)

public Products getByProductsCode(@PathVariable("p_code") String p_code) {

log.info("Select Product by p_code");


Products product = productService.selectByProductCode(p_code);


return product;

}


@PostMapping(value = "/product")

public ResponseEntity<?> insertProduct(@RequestBody Products product, UriComponentsBuilder ucBuilder) {

log.info("Insert Product : " + product);


productService.insertProduct(product);


return new ResponseEntity<Products>(HttpStatus.CREATED);

}


@PutMapping(value = "/product/{p_code}")

public ResponseEntity<?> updateProduct(@PathVariable("p_code") String p_code, @RequestBody Products product) {

log.info("Updating Product with p_code : " + product);


productService.updateProduct(product);


return new ResponseEntity<Products>(HttpStatus.OK);

}


@DeleteMapping(value = "/product/{p_code}")

public ResponseEntity<?> deleteProduct(@PathVariable("p_code") String p_code) {

log.info("Deleting Product with p_code : " + p_code);


productService.deleteProduct(p_code);


return new ResponseEntity<Products>(HttpStatus.NO_CONTENT);

}


// 공지사항 관련 controller

@RequestMapping(value = "/notice", method = RequestMethod.GET)

public List<Notice> listAllNotices() {

log.info("Select All Notices");


List<Notice> noticeList = noticeService.selectAllNotice();


return noticeList;

}


// 공지사항 카테고리별 조회

@RequestMapping(value = "/notice/{n_category}", method = RequestMethod.GET)

public List<Notice> getByNoticeCategory(@PathVariable("n_category") String n_category) {

log.info("Select Notice by n_category");


List<Notice> noticeCategoryList = noticeService.selectByNoticeCategory(n_category);


return noticeCategoryList;

}


// 공지사항 조회수 증가

@PutMapping(value = "/detail/notice/{n_no}")

public ResponseEntity<?> incrementNoticeHits(@PathVariable("n_no") long n_no, @RequestBody Notice notice) {

log.info("Increment Notice by n_no" + n_no);


notice.setN_no(n_no);

Notice noticeObject = noticeService.incrementNoticeHits(n_no);


return new ResponseEntity<Notice>(noticeObject, HttpStatus.OK);

}


// 공지사항 제목 검색

@RequestMapping(value = "/notice/search/{n_title}", method = RequestMethod.GET)

public List<Notice> getByNoticeTitleSearch(@PathVariable("n_title") String n_title) {

log.info("Select Notice By n_title");


List<Notice> searchNoticeTitle = noticeService.searchByNoticeTitle(n_title);


return searchNoticeTitle;


}


// 자주 묻는 질문 관련 controller

@RequestMapping(value = "/faq", method = RequestMethod.GET)

public List<Faq> listAllFaq() {

log.info("Select All Faq");


List<Faq> faqList = faqService.selectAllFaq();


return faqList;

}


// 자주 묻는 질문 카테고리별 조회

@RequestMapping(value = "/faq/{f_category}", method = RequestMethod.GET)

public List<Faq> getByFaqCategory(@PathVariable("f_category") String f_category) {

log.info("Select Faq by f_category");


List<Faq> faqCategoryList = faqService.selectByFaqCategory(f_category);


return faqCategoryList;

}


// 자주 묻는 질문 조회수 증가

@PutMapping(value = "/detail/faq/{f_no}")

public ResponseEntity<?> incrementFaqHits(@PathVariable("f_no") long f_no, @RequestBody Faq faq) {

log.info("Increment Faq by f_no" + f_no);


faq.setF_no(f_no);

faqService.incrementFaqHits(f_no);


return new ResponseEntity<Faq>(HttpStatus.OK);

}


// 자주 묻는 질문 제목 검색

@RequestMapping(value = "/faq/search/{f_title}", method = RequestMethod.GET)

public List<Faq> getByFaqTitleSearch(@PathVariable("f_title") String f_title) {

log.info("Select Faq By f_title");


List<Faq> searchFaqTitle = faqService.searchByFaqTitle(f_title);


return searchFaqTitle;

}


// 1:1 질문 관련 controller

@RequestMapping(value = "/qna/list/{u_id}", method = RequestMethod.GET)

public List<Qna> listAllQna(@PathVariable("u_id") String u_id) {

log.info("Select All Qna");


List<Qna> qnaList = qnaService.selectAllQna(u_id);


return qnaList;

}


// 관리자용 1:1질문 모두 가져오기

@GetMapping("/admin/qna/list")

public List<Qna> adminGetlistAllQna() {

List<Qna> qnaList = qnaService.adminSelectAllQna();

return qnaList;

}


// 1:1 질문 번호 조회 후 객체 하나 리턴

@RequestMapping(value = "/detail/qna/{q_no}", method = RequestMethod.GET)

public Qna getByQnaNo(@PathVariable("q_no") long q_no) {

log.info("Select Qna by q_no");


Qna qna = qnaService.selectByQnaNo(q_no);


return qna;

}


// 1:1 질문 제목 검색

@RequestMapping(value = "/qna/search/{q_title}", method = RequestMethod.GET)

public List<Qna> getByQnaTitleSearch(@PathVariable("q_title") String q_title) {

log.info("Select Qna By f_title");


List<Qna> searchQnaTitle = qnaService.searchByQnaTitle(q_title);


return searchQnaTitle;

}


// 1:1 질문 답변유무 별 조회

@RequestMapping(value = "/qna/{q_reply}", method = RequestMethod.GET)

public List<Qna> getByQnaReply(@PathVariable("q_reply") String q_reply) {

log.info("Select Qna by q_reply");


List<Qna> qnaReplyList = qnaService.selectByQnaReply(q_reply);


return qnaReplyList;

}


// 1:1 질문 글쓰기

@PostMapping(value = "/qna/write")

public ResponseEntity<?> insertQna(@RequestBody Qna qna, UriComponentsBuilder ucBuilder) {

log.info("Insert Qna : " + qna);


qnaService.insertQna(qna);


return new ResponseEntity<Qna>(HttpStatus.CREATED);

}


// 1:1 질문 글 수정

@PutMapping(value = "/qna/update/{q_no}")

public ResponseEntity<?> updateQna(@PathVariable("q_no") long q_no, @RequestBody Qna qna) {

log.info("Updating Qna with p_code : " + q_no);


Qna qnaObject = qnaService.selectByQnaNo(q_no);

if (qnaObject == null) {

return new ResponseEntity<Qna>(HttpStatus.FAILED_DEPENDENCY);

}


qna.setQ_no(q_no);


qnaService.updateQna(qna);


return new ResponseEntity<Qna>(HttpStatus.OK);

}


// 1:1 질문 글 하나 삭제

@DeleteMapping(value = "/qna/{q_no}")

public ResponseEntity<?> deleteQna(@PathVariable("q_no") long q_no) {

log.info("Deleting Qna with p_code : " + q_no);


qnaService.deleteQna(q_no);


return new ResponseEntity<Qna>(HttpStatus.NO_CONTENT);

}


// Websquare용 notice controller

@PostMapping(value = "/notice.do")

public Map websquareGetAllNotice() {

log.info("Get All Notice");


Map noticeObj = new HashMap<>();

noticeObj.put("noticeList", noticeService.selectAllNotice());

noticeObj.put("msg", "조회가 완료되었습니다.");


return noticeObj;

}

@PutMapping(value = "/notice.update")

public void updateNotice(@RequestBody Map notice) {

ArrayList noticeList = (ArrayList)notice.get("updateNotice");

Map noticeMap;

Notice noticeObj = new Notice();

for (int i=0; i < noticeList.size(); i++) {

noticeMap = (Map)noticeList.get(i);

System.out.println(noticeMap);

System.out.println(noticeMap.get("rowStatus").toString());

if(noticeMap.get("rowStatus").toString().equals("U")) {

noticeObj.setN_no((int)noticeMap.get("nno"));

noticeService.editNotice(noticeObj);

}

}

}

@DeleteMapping(value = "/notice.delete")

public void removeNotice(@RequestBody Map rNotice) {

ArrayList noticeList = new ArrayList();

noticeList = (ArrayList) rNotice.get("removes");

Map rowData;

for(int i=0; i < noticeList.size(); i++) {

rowData = (Map)noticeList.get(i);

// System.out.println(rowData.get("col1"));

int removeNotice = (int)rowData.get("col1");

noticeService.deleteNotice(removeNotice);

}

}


@PostMapping(value = "/notice/saveAndSelectMember.do")

public Map saveAndSelectMember(@RequestBody Map param) throws Exception {

Map resObj = new HashMap();

List modList = null;

Map saveResult = null;

int modListLen;

Map modParam = new HashMap<String, List>();

List insert = new ArrayList<Map>();

List update = new ArrayList<Map>();

List delete = new ArrayList<Map>();

Map rowData;

String rowStatus;


try {

modList = (List) param.get("noticeList");

modListLen = modList.size();


for (int i = 0; i < modListLen; i++) {

rowData = (Map) modList.get(i);

rowStatus = (String) rowData.get("rowStatus");


if (rowStatus.equals("C")) {

insert.add(rowData);

} else if (rowStatus.equals("U")) {

update.add(rowData);

} else if (rowStatus.equals("D") || rowStatus.equals("E")) {

delete.add(rowData);

}

}

modParam.put("insert", insert);

modParam.put("update", update);

modParam.put("delete", delete);


saveResult = noticeService.saveSpNotice(modParam);


try {

resObj.put("noticeList", noticeService.selectAllNotice());

resObj.put("msg", "조회가 완료되었습니다.");

} catch (Exception ex) {

throw new RuntimeException("저장은 완료되었으나 조회도중 오류가 발생하였습니다. 다시 조회 해주시기 바랍니다.");

}

resObj.put("rsObj", saveResult);

resObj.put("msg", "저장이 완료되었습니다.");

resObj.put("msgCode", "S");

} catch (Exception ex) {

ex.printStackTrace();

}

return resObj;

}


// Websquare용 faq controller

@PostMapping(value = "/faq.do")

public Map websquareGetAllFaq() {

log.info("Get All Faq");


Map faqObj = new HashMap<>();

faqObj.put("faqList", faqService.selectAllFaq());

faqObj.put("msg", "조회가 완료되었습니다.");


return faqObj;

}


// Websquare용 qna controller

@PostMapping(value = "/qna.do")

public Map websquareGetAllQna() {

log.info("Get All Qna");


Map qnaObj = new HashMap<>();

qnaObj.put("qnaList", qnaService.adminSelectAllQna());

qnaObj.put("msg", "조회가 완료되었습니다.");


return qnaObj;

}


// 관리자 페이지 용 ↓

@PostMapping(value = "/faq/create")

public int createFaq(@RequestBody Faq faq) {

log.info("create faq");

return faqService.createFaq(faq);

}


@PutMapping(value = "/faq/update")

public int updateFaq(@RequestBody Faq faq) {

log.info("update faq");

return faqService.editFaq(faq);

}


@DeleteMapping(value = "/faq/delete/{f_no}")

public int deleteFaq(@PathVariable("f_no") long f_no) {

log.info("delete FAQ");

return faqService.deleteFaq(f_no);

}


@PostMapping(value = "/notice/create")

public int createNotice(@RequestBody Notice notice) {

log.info("create notice");

return noticeService.createNotice(notice);

}


@PutMapping(value = "/notice/update")

public int updateNotice(@RequestBody Notice notice) {

log.info("update notice");

return noticeService.editNotice(notice);

}


@DeleteMapping(value = "/notice/delete/{n_no}")

public int DeleteNotice(@PathVariable("n_no") long n_no) {

log.info("delete notice");

return noticeService.deleteNotice(n_no);

}


// qna답글달기

@PutMapping(value = "/qna/reply")

public int updateQnaReply(@RequestBody Qna qna) {

log.info("update qna reply");

return qnaService.updateQnaReply(qna);

}


// 관리자 페이지용↑

 

}







Angular 

<hr class="between-sections">

 

<div class="card card-cascade wider reverse">

 

  <!-- Card content -->

  <div class="card-body card-body-cascade text-center">

 

    <!-- Title -->

    <h4 class="card-title"><strong>공지사항</strong></h4>

  </div>

 

</div>

 

<hr class="between-sections">

 

<ol class="breadcrumb">

  <li class="breadcrumb-item">

    <a [routerLink]="['/index']">Home</a>

  </li>

  <li class="breadcrumb-item">고객센터</li>

  <li class="breadcrumb-item">공지사항</li>

</ol>

 

<div id="selectDiv">

  <select (change)="getNoticeByCategory($event.target.value)">

    <option value="" disabled selected>카테고리별 조회</option>

    <option *ngFor="let category of categoryList" [value]="category">

      {{ category }}

    </option>

  </select>

</div>

 

<!--Table-->

<table class="table">

  <!--Table head-->

  <thead>

    <tr class="cyan lighten-4">

      <th>번호</th>

      <th>카테고리</th>

      <th>제목</th>

      <th>작성자</th>

      <th>작성일</th>

      <th>조회수</th>

    </tr>

  </thead>

  <!--Table head-->

 

  <!--Table body-->

  <tbody class="view overlay">

    <tr *ngFor="let notice of noticeList | paginate: { itemsPerPage: 10, currentPage: page }; let i = index">

      <th scope="row">{{ i+1 }}</th>

      <th>{{ notice.n_category }}</th>

      <th>

        <a [routerLink]="['/detail/notice']" routerLinkActive="router-link-active" (click)="setNoticeNo(notice.n_no)">{{ notice.n_title }}

        </a>

      </th>

      <th>{{ notice.a_id }}</th>

      <th>{{ notice.n_date | date:'yyyy-MM-dd' }}</th>

      <th>{{ notice.n_hits }}</th>

    </tr>

  </tbody>

  <!--Table body-->

 

</table>

<!-- Pagination -->

<div class="text-center mt-3">

  <pagination-controls (pageChange)="page = $event"></pagination-controls>

</div>

 

<form class="form-inline mr-auto" (ngSubmit)="searchTerm()">

  <input class="form-control mr-sm-2 w-50 p-1" type="text" placeholder="검색할 제목을 입력해주세요." id="searchInput" [(ngModel)]="search" [ngModelOptions]="{standalone: true}" />

  <button class="btn btn-outline-success btn-rounded btn-sm my-0" type="submit">검색</button>

</form>

 

 

<hr class="between-sections">


---------------------------------------------------------------------------------------------------------------

<hr class="between-sections">

<div class="card card-cascade wider reverse">

  <!-- Card content -->
  <div class="card-body card-body-cascade text-center">

    <!-- Title -->
    <h4 class="card-title"><strong>공지사항</strong></h4>
  </div>

</div>

<hr class="between-sections">

<ol class="breadcrumb">
  <li class="breadcrumb-item">
    <a [routerLink]="['/index']">Home</a>
  </li>
  <li class="breadcrumb-item">고객센터</li>
  <li class="breadcrumb-item">
    <a [routerLink]="['/notice']">공지사항</a>
    <!-- delete : (click)="removeToken()" -->
  </li>
</ol>

<!--Table-->
<table class="table table-bordered">

  <!--Table body-->
  <tbody>
    <tr>
      <th class="cyan lighten-4">제목</th>
      <td colspan="3">{{ notice?.n_title }}</td>
    </tr>
    <tr>
      <th class="cyan lighten-4">작성자</th>
      <td colspan="3">{{ notice?.a_id }}</td>
    </tr>
    <tr>
      <th class="cyan lighten-4">작성일</th>
      <td>{{ notice?.n_date | date:'yyyy-MM-dd' }}</td>
      <th class="cyan lighten-4">조회수</th>
      <td>{{ notice?.n_hits }}</td>
    </tr>
    <tr>
      <td colspan="4">
        <pre>{{ notice?.n_content }}</pre>
      </td>
    </tr>
  </tbody>
  <!--Table body-->

</table>
<!--Table-->

<button type="button" class="btn btn-outline-info waves-effect" [routerLink]="['/notice']">목록</button>
<!-- delete (click)="removeToken()" -->

--------------------------------------------------------------------------------------------------------------

import { Component, OnInit } from '@angular/core';
import { HttpClientModule, HttpHeaders, HttpClient } from '@angular/common/http';

import { NoticeService } from '../../shared/services/notice.service';
import { Notice } from '../../shared/models/notice';
import { TokenService } from '../../shared/services/token.service';

@Component({
  selector: 'app-notice-detail',
  templateUrl: './notice-detail.component.html',
  styleUrls: ['./notice-detail.component.css']
})
export class NoticeDetailComponent implements OnInit {
  notice: Notice;

  constructor(
    private noticeService: NoticeService,
    private http: HttpClient,
    private tokenService: TokenService
  ) { }

  ngOnInit() {
    this.notice = this.noticeService.getNoticeNoObject();

    if(this.notice == null) {
      var n_no = this.tokenService.getToken("noticeDetailToken");
      var noticeList = this.tokenService.getToken("noticeToken");
      var notice = noticeList.find(function(item){
        return item.n_no === n_no;
      });
      var n_content = notice.n_content;
      notice.n_content = notice.n_content.replace("\r\n","<br>");
      this.notice = notice;
    }
  }

}


Comments