ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 75일차 - 스프링부트 환경 구성 및 간단한 예제 개발
    백엔드(웹 서버, WAS)/Spring Boot 2024. 5. 16. 17:46

    pom.xml 에서 라이브러리 다운로드 받은 위치가 두번째 줄의 경로에 차곡차곡 설치된다

    <localRepository>C:/repository</localRepository>

    - 스프링부트에서 라이브러리는 C:/repository 에 저장해줘

     

     

    스프링 부트의 특징

    1. 잭슨 라이브러리 필요없다 왜냐하면 백엔드만 개발하기 때문에

    2. JSP 는 불편한점이 많아서 다른거를 사용한다

    3. 톰캣 설치하지 않아도 톰캣이 내장되어있다 (실제 톰캣보다 성능이 매우 떨어진다)

    4. 내장 톰캣이 있기 때문에 JAR 라는 놈으로 묶어서 사용할 수 있다

    스프링을 먼저 배워야지 XML 이나 설정 파일들이 익숙해져서 부트에서는 쉬워지기 때문에

    스프링과 부트의 차이는 XML를 비교해보면 알 수 있다 XML 를 객체화해 단순화시킨것이 부트이다

    첫 프로젝트 생성

    애는 기본적으로 어떤 라이브러리를 사용할지 프로젝트 생성 전에서 선택할 수 있다

    1. 자바 버젼이 17 을 사용한다고 했는데 로컬 환경은 11이라 오류가 난다

    2. Mybatis 나 다른 라이브러리 버젼과 호환을 위해 스프링도 3.2 가 아니라 2.7.17 로 변경해야한다

    pom.xml 에서 작성 후 maven - update project 하여 작성한 내용을 반영해야한다

    1. webapp 에는 비어있는 상태이다 왜냐하면 jsp 를 지원하지 않는다 

    2. 삼단 패키지 구성 설정도 안해도 된다 부트 내부에서 해주기 때문에

    application.properties 작성 시 유의사항

    1. 한글쓰면 다 깨진다

    2. 관련된 모든 설정은 여기서 작성한다

    3. key-value 쌍으로 이루어져있다

    // JSP 지원도 하지 않고, .jsp 붙여주고 경로 매핑도 되어지있지 않아서 안된다
    /*
    @RequestMapping(value="/")
    public String home() {
        return "";
    }
    */
    
    @RequestMapping(value="/")
    @ResponseBody
    public Map<String, String> home() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("msg", "OK");
        return map;
    }

    내장 톰캣으로 작성한 코드를 실행해보자

    크롬 브라우저에서 localhost 로 접속하면 아까 작성한 코드가 실행되어 ok 라는 메시지를 전달해준다

    서버 꺼주자

    //@Controller
    @RestController // @ResponseBody 없이 jsp 형태로 보내주는 컨트롤러이다
    public class MainController {
    	
    	// JSP 지원도 하지 않고, .jsp 붙여주고 경로 매핑도 되어지있지 않아서 안된다
    	/*
    	@RequestMapping(value="/")
    	public String home() {
    		return "";
    	}
    	*/
    	
    	@RequestMapping(value="/")
    	//@ResponseBody
    	public Map<String, String> home() {
    		Map<String, String> map = new HashMap<String, String>();
    		map.put("msg", "OK");
    		return map;
    	}
    }

     

    spring.application.name=01_Start
    # PORT
    server.port=80
    # UTF-8
    server.servlet.encoding.charset=UTF-8
    server.servlet.encoding.enabled=true
    server.servlet.encoding.force=true

    스프링 부트에서 기초 AJAX

     

    @RestController
    public class AjaxController {
    	@RequestMapping(value="/")
    	public Map<String,Object> home() {
    		Map<String,Object> response = new HashMap<String,Object>();
    		response.put("msg", "Hello main page");
    		return response;
    	}
    
    	@RequestMapping(value="/list")
    	public Map<String,Object> list() {
    		Map<String,Object> response = new HashMap<String,Object>();
    		List<String> list = new ArrayList<String>();
    		list.add("first");
    		list.add("second");
    		list.add("third");
    		response.put("list", list);
    		return response;
    	}
    }

     

     

    HTML 파일을 하나 생성해서 HTML 가 AJAX 요청을 한 후 받아오는 작업을 해보자

    <html>
        <head>
            <meta charset="UTF-8">
            <title>J-QUERY</title>
            <link rel="icon" href="../img/chrome.png">
            <!--Content Delivery Network 방식-->
            <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
        </head>
        <body>
    
        </body>
        <script>
            $.ajax({
                type:'GET',
                url:'',
                data:{},
                dataType:JSON,
                success:function(data) {
                    console.log(data);
                },
                error:function(error) {
                    console.log(error);
                }
            });
        </script>
    </html>

     

    외부에서 ajax 요청을 할때에는 서버 주소를 명시해줘야지 올바르게 요청이 서버에 전달된다


    CrossOrigin으로 AJAX 통신 허용

     

    Access to XMLHttpRequest at 'http://localhost/list' from origin 'null' has been blocked 
    by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    오리진(서버) 접근 제어가 금지되어있어서 AJAX 요청이 안되니깐 허용해줘

    자바 스크립트하고 서버와 통신하려고하면 외부의 공격자가 변조하여 서버의 정보를 탈취할 수 있기 때문에 막아둔다

    외부 자바스크립트가 통신을 요청할때 @CrossOrigin 으로 허용해준다

    // Cross domain issue - CORS, 서로 다른 도메인(서버)에 있는 자바스크립트와 서버간의 통신을 제한한다
    // 이것을 해결하기 위해서는 서버에서 요청을 허용하도록 해줘야한다
    // @CrossOrigin 이 클래스 위에 선언되어 있으면 해당 메서드들은 모두 허용된다
    // @CrossOrigin 이 클래스 위에 선언되어 있으면 해당 메서드만 허용한다
    // @CrossOrigin(origins={"space", "group"}) 과 특정한 url 만 허용할 수도 있다
    // 외부에서는 읽기만 허용하고 쓰거나 실행은 불가능하다
    @CrossOrigin
    <html>
        <head>
            <meta charset="UTF-8">
            <title>J-QUERY</title>
            <link rel="icon" href="../img/img01.jpg">
            <!--Content Delivery Network 방식-->
            <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
        </head>
        <body>
            <h1>HI</h1>
        </body>
        <script>
            // 파일의 위치가 프로젝트 밖에 있다면 서버 주소도 명시 해줘야한다
            $.ajax({
                type:'GET',
                url:'http://localhost/list',
                data:{},
                dataType:'JSON',
                success:function(data) {
                    console.log(data);
                },
                error:function(error) {
                    console.log(error);
                }
            });
        </script>
    </html>


    Logger 적용

    보통 INFO 에서 DEBUG 까지 확인한다

    @RestController
    public class LogController {
    	Logger logger = LoggerFactory.getLogger(this.getClass());
    	# FATAL > ERROR > WARN > INFO(*) > DEBUG > TRACE
    	@RequestMapping(value="/")
    	public String home() {
    		logger.info("home page 방문");
    		return "home page 방문";
    	}
    	
    	@RequestMapping(value="/root")
    	public String root() {
    		logger.warn("root page 방문");
    		return "root page 방문";
    	}
    	
    	@RequestMapping(value="/index")
    	public String index() {
    		logger.debug("index page 방문");
    		return "index page 방문";
    	}
    	
    }


    JSP 연동 설정

    스프링부트는 jsp 를 지원하지 않기 때문에 추가적인 라이브러리 설치와 설정이 필요하다

    스프링 부트에서는 알아서 일부 라이브러리에 대해서 버젼 관리를 해준다

    서버에서 Views 폴더 경로로 지정해두고 반환시 .jsp 붙여서 응답한다

     

    	@RequestMapping(value="/")
    	public String home() {
    		logger.info("메인페이지 진입");
    		// main 이라는 문자열에 
    		// prefix = /views/
    		// suffix = .jsp
    		// 를 이용하여 /views/main.jsp 로 이동시킨다
    		return "main";
    	}


    Mybatis 연동

     

    db, mybatis 관련 라이브러리 받아놓고 해당 설정 등이 안되어 있으면 에러가 난다

    JSP 와 JSTL 라이브러리는 필수이다

     

    resources 폴더 아래에 매퍼만 담고 있는 폴더를 하나 만들어서 편리하게 관리한다

    1. 스프링부트에서는 따로 마이바티스이 사용되는 범위를 지정하지 않아도 된다

    2. 손쉽게 데이터베이스 접속 정보를 입력한다

    3. 

    @Mapper

    매퍼 등록을 위한 인터페이스에 선언하여 사용한다

    // 자동으로 마이바티스를 사용하는 설정이 된다
    @Mapper
    public interface MainDAO {
    
    }

    @MapperScan

    매퍼를 하나씩 등록하는게 아닌 페키지 경로를 지정하여 이하 위치에있는 인터페이스들은 전부 맵퍼로 사용할수있다

    @Service
    @MapperScan(value= {"kr.co.gudi.dao"}) // mybatis 사용 범위
    public class MainService {
    	Logger logger = LoggerFactory.getLogger(this.getClass());
    	@Autowired MainDAO dao;
    }

     

    과제

    "/" 요청시 list.jsp 에 게시판 리스트 출력

     

    환경

    JAVA : 11

    Spring Boot : 2.7.17

    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.3.2</version>
    </dependency>
    
    <!-- mariadb -->
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    <!-- JSP 
    https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-jasper -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-jasper</artifactId>
        <version>9.0.85</version>
    </dependency>
    
    <!-- JSTL 
    https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl
    BOOT 에서는 일부 라이브러리에 대해서 버젼 관리를 지원한다 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

     

Designed by Tistory.