ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2022-03-23 스프링 부트 : 쇼핑몰#1
    학원/Spring 2022. 3. 23. 16:02

     

    MAVEN을 이용한 쇼핑몰 만들기 

     

     

     

    - pom.xml 수정

     

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.6.4</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	
    	<groupId>com.example</groupId>
    	<artifactId>SpM17</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>SpringBoot_M17_shop</name>
    	<description>Demo project for Spring Boot</description>
    	
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    	
    	<repositories>
    		<repository>
    	        <id>oracle</id>
    	        <name>ORACLE JDBC Repository</name>
    	        <url>http://maven.jahia.org/maven2</url>
    	    </repository>
    	</repositories>
    	
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-validation</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.mybatis.spring.boot</groupId>
    			<artifactId>mybatis-spring-boot-starter</artifactId>
    			<version>2.2.2</version>
    		</dependency>
    
    		<dependency>
    			<groupId>com.oracle.database.jdbc</groupId>
    			<artifactId>ojdbc8</artifactId>
    			<scope>runtime</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.projectlombok</groupId>
    			<artifactId>lombok</artifactId>
    			<optional>true</optional>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    		
    		<!-- JSP -->
    		<dependency>
    			<groupId>org.apache.tomcat.embed</groupId>
    			<artifactId>tomcat-embed-jasper</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>jstl</groupId>
    			<artifactId>jstl</artifactId>
    			<version>1.2</version>
    		</dependency>
    		
    		<!-- file Upload -->
    		<dependency>
    			<groupID>servlets.com</groupID>
    			<artifactId>cos</artifactId>
    			<version>05Nov2002</version>
    		</dependency>
    		
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    				<configuration>
    					<excludes>
    						<exclude>
    							<groupId>org.projectlombok</groupId>
    							<artifactId>lombok</artifactId>
    						</exclude>
    					</excludes>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>

     

     

    - application.properties

     

    #Server port
    server.port=8070
    
    #about JSP
    spring.mvc.view.prefix=/WEB-INF/views/
    spring.mvc.view.suffix=.jsp
    
    #multi-part Form
    spring.servlet.multipart.enabled=false
    
    #oracle set
    spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
    spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
    spring.datasource.username=scott
    spring.datasource.password=tiger
    
    #mybatis 
    mybatis.mapper-locations=classpath:mybatis/mapper

     

     


     

     

    jsp, css, js 파일들은 다 재사용할 것

    -> 인클루드할 header,footer.jsp 는 views 폴더 안에 있어야함 (jsp 파일은 모두 views안에)

    --> header에 loginUser의 필드명을 대문자로

    --> CSS와 JS 경로는 src="/script/member.js" 형식으로 작성한다

     

    index 페이지

     

    ProductController

     

    package com.ezen.spm17.controller;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.ezen.spm17.service.ProductService;
    
    @Controller
    public class ProductController {
    	
    	@Autowired
    	ProductService ps;
    	
    	@RequestMapping("/")
    	public ModelAndView index( HttpServletRequest request, Model model) {
    		
    		ModelAndView mav = new ModelAndView();
    		
    		HashMap<String, Object> paramMap = new HashMap<>();
    		paramMap.put("ref_cursor1", null);
    		paramMap.put("ref_cursor2", null);
    		
    		ps.getBestNewProduct(paramMap);
    		
    		ArrayList<HashMap<String, Object>> list1
    			= (ArrayList<HashMap<String, Object>>) paramMap.get("ref_cursor1");
    		
    		ArrayList<HashMap<String, Object>> list2 
    		= (ArrayList<HashMap<String, Object>>) paramMap.get("ref_cursor2");
    		
    		mav.addObject("newProductList", list1);
    		mav.addObject("bestProductList", list2);
    		mav.setViewName("main");
    		
    		return mav;
    	}
    	
    }

     

     

    ProductDao

     

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    	
    <mapper namespace="com.ezen.spm17.dao.IProductDao">
    	
    	<resultMap id="productMap" type="java.util.HashMap"></resultMap>	
    	<resultMap id="productMap2" type="java.util.HashMap"></resultMap>	
    	
    	<select id="getBestNewProduct" statementType="CALLABLE" parameterType="java.util.HashMap">
    	    {CALL getBestNewProduct(
    	        #{ref_cursor1, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=productMap},
    	        #{ref_cursor2, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=productMap2}
    	    )}
    	</select>
    
    </mapper>

     

     

     

    프로시저

     

    create or replace PROCEDURE getBestNewProduct(
        p_cur1 OUT SYS_REFCURSOR,
        p_cur2 OUT SYS_REFCURSOR 
    )
    IS
    BEGIN
        open p_cur1 for 
            select * from new_pro_view;
        open p_cur2 for
            select * from best_pro_view;
    END;

     


     

     

    에러 

     

     

    1) org.xml.sax.saxparseexception 프롤로그에서는 콘텐츠가 허용되지 않습니다

     

    -> 검색해보니 xml 파일 첫번째줄

    <?xml version="1.0" encoding="UTF-8"?>

    앞에 어떤 문자가 들어가서 나는 에러라고 나오는데 새로 파일을 만들고 다시 써보고 프로젝트도 새로 만들어보고 했는데도 고쳐지질 않았다..

     

    결국 뭐가 문제였냐면

    application.properties에서 mybatis 관련 코드를

     

    mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml

     

    로 작성 해야되는데 

     

    mybatis.mapper-locations=classpath:mybatis/mapper 까지만 작성해서 생긴 오류였다...

    복붙을 잘하자...

     

     

    2) org.xml.sax.saxparseexception 예기치 않은 파일의 끝입니다

     

    -> 위 오류 수정 중에 새로운 xml 파일을 만들어놓고 아무것도 작성하지 않은 채로 내버려둬서 생긴 오류

    빈 xml파일을 삭제하니 고쳐졌다

     

     


     

    로그인 / 로그아웃

     

    MemberController

     

    @RequestMapping(value="/loginForm")
    public String loginForm() {
        return "member/login";
    }
    
    @RequestMapping(value="/login", method=RequestMethod.POST)
    public String login( @ModelAttribute("dto") @Valid MemberVO membervo,
            BindingResult result, 
            HttpServletRequest request,
            Model model) {
        System.out.println(membervo.getUserid());
        if( result.getFieldError("userid") != null ) {
            model.addAttribute("message" , "아이디를 입력하세요");
            return "member/login";
        }else if( result.getFieldError("pwd") != null ) {
            model.addAttribute("message" , "패스워드를 입력하세요");
            return "member/login";
        }else {
            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("userid", membervo.getUserid() );
            paramMap.put("ref_cursor", null);
            ms.getMember(paramMap);
            ArrayList< HashMap<String,Object> > list 
                = (ArrayList<HashMap<String, Object>>) paramMap.get("ref_cursor");
            if(list.size() == 0) {  // 입력한 아이디 없다면
                model.addAttribute("message" , "아이디가 존재하지 않습니다");
                return "member/login";
            }
            HashMap<String, Object> mvo = list.get(0);
            if(mvo.get("PWD")==null) {
                model.addAttribute("message" , "관리자에게 문의하세요");
                return "member/login";
            }else if( membervo.getPwd().equals( (String)mvo.get("PWD") ) ) {
                HttpSession session = request.getSession();
                session.setAttribute("loginUser", mvo);
                return "redirect:/";
            }else {
                model.addAttribute("message" , "비밀번호가 일치하지 않습니다.");
                return "member/login";
            }
        }
    }
    
    
    @RequestMapping(value="/logout")
    public String logout(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.removeAttribute("loginUser");
        return "redirect:/";
    }

     

     

    MemberDao

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
        
    <mapper namespace="com.ezen.spm17.dao.IMemberDao">
    
    	<resultMap  id="memberMap" type="java.util.HashMap"></resultMap>
    	
    	<select id="getMember" statementType="CALLABLE" parameterType="java.util.HashMap">
    		{  CALL getMember_s( 
    			#{userid},
    			#{ref_cursor , mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=memberMap}
    		)  }
    	</select>
    
    </mapper>

     

     

    프로시저

     

    CREATE OR REPLACE PROCEDURE getMember_s(
        p_userid IN member2.userid%TYPE, 
        p_curvar OUT SYS_REFCURSOR
    )
    IS
    BEGIN
        OPEN p_curvar FOR SELECT * FROM member2 WHERE userid=p_userid;
    END;

     

     

     

    댓글

Designed by Tistory.