项目作者: GtYoo

项目描述 :
Customer Data . Spring MVC model-2
高级语言: Java
项目地址: git://github.com/GtYoo/PracticeJava-2.git
创建时间: 2021-05-16T11:50:44Z
项目社区:https://github.com/GtYoo/PracticeJava-2

开源协议:Apache License 2.0

下载


PracticeJava-2

Customer Data . Spring MVC model-2

이 문서는 저의 Java 복습을 위해 직접 만들었습니다.
문서내용이 도움이 되셨으면 좋겠습니다.

고객정보 관리 시스템

Spring MVC model-2를 이용해 개발
Code view - Customer
Spring MVC로 인해 편리해지는 것들

「 파라미터의 수집을 간편히 할수있다. 」

「 어노테이션 설정을 통한 URI 설정 」

「 로직의 집중(모듈화) 」

「 테스트의 제공 」

「 상속이나 인터페이스의 제약에 자유롭다. 」

「 파라미터와 리턴타입의 자유도 」

  • ERD 설계(Oracle SQL)

    기본 고객테이블이외에 히스트리 관리 테이블도 생성한다.

    1. CREATE TABLE CUSTOMER(
    2. CODE NUMBER(3) PRIMARY KEY,
    3. NAME VARCHAR2(30),
    4. EMAIL VARCHAR2(30),
    5. TEL VARCHAR2(35),
    6. WEIGHT NUMBER(4,1)
    7. );
    1. CREATE TABLE MBR_HIST(
    2. REG_DT TIMESTAMP,
    3. CONTENTS VARCHAR2(300)
    4. );
  • Model

    Service / DAO / DTO 설계 및 구현 . 인터페이스를 가지도록 구현한다.

    Model - Service Interface / Service / DAO Interface / DTO

    DAO에서의 데이터베이스 쿼리문은 Mybatis를 통해 Java에서 쓰이지 않고 Mapping을 통해 전달된다.

    독립적으로 분리함으로서 다른 소프트웨어와의 호환성을 높인다.

    1. public interface IDaoCst {
    2. Cst getUser(int code);
    3. List<Cst> getAllUser(HashMap<String, Object> hm);
    4. void insertUser(Cst cst);
    5. void updateUser(Cst cst);
    6. void deleteUser(int code);
    7. int cstCnt();
    8. }

    Mapper.xml

    1. <select id="getAllUser" resultType="cstDto" parameterType="HashMap">
    2. <![CDATA[
    3. SELECT * FROM ( SELECT ROWNUM RNUM, O.* FROM
    4. ( SELECT * FROM CUSTOMER ORDER BY CODE ASC ) O )
    5. WHERE RNUM >= #{PAGE_NO} AND ROWNUM <= #{MAX_ROWS}
    6. ]]>
    7. </select>

    페이징 처리하기위한 쿼리문이다. xml파일에 쿼리문 작성시 비교연산자의 < , > 와 같은 연산자는 태그를 닫고 여는 처리와 같기때문에 제대로 쿼리문이 완성되지 않는다. 이때 <![CDATA[]]> 를 써주면 된다. 실무에 쓰이는 방법이다.

    Mapping시 주의할점은 Mapper파일의 생성은 업무와 서비스 기준으로 한다는 것이다. 하나 서비스에 1개의 Mapper파일은 무조건 가진다. 복수의 갯수를 가지기도 한다.

    Mapper namespace는 DAO interface를 지정해준다.

    1. <mapper namespace="com.sprMbts.customer.IDaoCst">

    @ 어노테이션을 사용한 객체호출

    1. @Service("custService")
    2. public class CustServiceImpl implements ICustService {
    3. @Autowired
    4. private IDaoCst daoCst;
    5. @Autowired
    6. private IDaoHist daoHist;

    Transaction 처리가 필요한 서비스 메소드 . insert / update / delete

    1. //등록
    2. @Override
    3. @Transactional
    4. public String insertCst(Cst cst) throws Exception {
    5. logger.info("Insert Cst called =============");
    6. logger.info("입력한 CODE : {}" , cst.getCode());
    7. logger.info("입력한 NAME : {}" , cst.getName());
    8. logger.info("입력한 EMAIL : {}" , cst.getEmail());
    9. logger.info("입력한 TEL : {}" , cst.getTel());
    10. logger.info("입력한 WEIGHR : {}" , cst.getWeight());
    11. Cst cstDto = daoCst.getUser(cst.getCode());
    12. if(cstDto != null)
    13. {
    14. throw new Exception();
    15. }
    16. daoCst.insertUser(cst);
    17. daoHist.insertHist("Insert " + cst.toString());
    18. return "redirect:/sltMul?PAGE_NO=1";
    19. }
  • View

    보여지는 page 부분을 담당한다. JSTL과 EL을 사용하여 Java코드를 분리함으로서 유지보수를 수월하게 해준다. Spring MVC에서 css와 js 파일을 링크할때 그냥 링크만 걸어주면 적용이 되지 않는다. 이때 아래와 같이 해주자.

    1. <c:set var="path" value="${pageContext.request.contextPath}"></c:set>
    2. <html>
    3. <head>
    4. <link rel="stylesheet" href="${path}/resources/css/cst.css"/>
    5. <script src="${path}/resources/js/func.js"></script>

    css / js 파일은 webapp폴더 밑의 resources 폴더를 만들어 각각 넣어주도록 한다.

    View - View.jsp

  • Controller

    View로부터 request를 받아서 어떤 Service로 처리할 것인지 결정한다.

    Service 와 마찬가지로 @ 어노테이션을 사용해 호출과 리퀘스트를 받는다.

    1. @Controller
    2. public class CustController {
    3. @Autowired
    4. private ICustService custService;
    5. private static final Logger logger =
    6. LoggerFactory.getLogger(CustController.class);
    7. @RequestMapping(value = "/")
    8. public String home() {
    9. logger.info("Home called ==============");
    10. return "redirect:/cstStart.jsp";
    11. }
    12. //전체리스트
    13. @RequestMapping("sltMul")
    14. public String main(Model model, @ModelAttribute("PAGE_NO") String pageNo)
    15. throws Exception {
    16. logger.info("Select Mul ==============");
    17. return custService.selectAll(model, pageNo);
    18. }

    @RequestMapping 을 통해 어떤 page로부터 호출이 오는지 알수있고 처리할수 있다.

    @ModelAttribute 를 사용해 파라미터 값을 받아올수 있다.

    Model 은 Servlet 에서 사용하던 request.setAttribute()와 같은 역할로서 .addAttribute()를 사용해 데이터전달이 가능하다.

    Controller

    1. //단건조회
    2. @RequestMapping("sltOne")
    3. public String selectOne(Model model, @ModelAttribute("PAGE_NO") String pageNo,
    4. @ModelAttribute("CODE") String code) throws Exception {
    5. logger.info("Select One ==============");
    6. return custService.selectOne(model, pageNo, code);
    7. }

    Service

    1. //단건조회
    2. @Override
    3. public String selectOne(Model model, String pageNo, String code) throws Exception {
    4. logger.info("SeleceOne Cst called =============");
    5. int nPageNo = Integer.parseInt(pageNo);
    6. int nCode = Integer.parseInt(code);
    7. Cst cstDto = daoCst.getUser(nCode);
    8. model.addAttribute("PAGE_NO", nPageNo);
    9. model.addAttribute("CST", cstDto);
    10. return "cstViewInfoSearch";
    11. }

    Controller로부터 파라미터값을 전달받은 Service 가 DAO를 통해 데이터 처리를 하고 그 데이터 값을 model에 저장해 ViewPage를 forward 하였다.

  • 어려웠던 점

    결합도와 의존성을 낮추기 위해 Service 와 Controller가 Interface를 바라보게 해야한다는 점이 처음에는 어려웠다. 부분적으로 반복학습함으로서 Interface의 구현과 사용방법등을 익힐 필요가 있다고 느꼈다. 더불어 .xml 파일들의 세부적인 사항은 외울수 밖에 없는 것 같다. 초심자에겐 알고 쓰기가 굉장히 어렵고 다 이해하기가 힘든 부분이 있다. 특히 라이브러리의 경우는 하나하나 다 기억하기도 힘들고 통째로 외워두는게 마음이 편할거 같은 기분이 든다.

  • 실행

    • 다건조회

      ex-screenshot

    • 단건조회

      ex-screenshot

    • 고객정보등록

      ex-screenshot

    • 삭제

      ex-screenshot