[Spring Boot] 주가 확인(Stock market) 웹사이트 만들기 (1)

2020. 9. 8. 00:12프로젝트/etc

#Spring Boot

비전공자가 정처기 자격증을 가진다고 전공자 만큼의 지식을 지녔음을 증명한다는 건 터무니 없다.(주관적인 의견) 학원 상담만 했을 땐 비전공자는 정처기가 필수래서 이렇게 믿었다 난. 대기업, 공기업을 위해 반드시 필요한 줄 알았다. 그러나 크게 플러스로 작용하지 않는다. 머기업, 공기업은 전공자들도 들어가기 힘든데 비전공자인 나는 내 기준에서 날고 기어야한다. 스타트업에서 경력을 쌓으며 코딩테스트를 준비해 대기업 입사가 현실적인 기준에 맞을수도 있다.

아무렴 스스로 Spring Boot를 이용해 웹사이트 정도는 만들줄 알아야 회사에서 써줄 것 같았다. 아침에 겁먹고 한동안 컴퓨터 근처에는 가지도 않다가 저녁이 돼서야 구글링 해가며 Spring Boot 설정과 DB 연동 맛보기까지 할 수 있었다. 본질을 단순화하면 프로그래밍도 언어와 같다. 영어랑 중국어 해봤지 않냐. 모르는 단어가 더 많을 땐 좌절하지. 아는 단어가 많아지고, 이해하는 부분이 늘어나면 두려움은 이해하는 나 자신에 대한 놀라움으로 바뀐다. Spring Boot도 그런 것 같다. 모르는 library 들을 직업 추가해 쳐보고 구동해보고 익숙해지면 두려움이란 장막은 걷히고 깊이있는 지식의 장으로 들어갈 수도 있다.  

많은 좌절 중 하나의 장점은 1개월 반 전 Spring Boot 프로젝트 인강을 들었을 때보다 막히는 부분의 빈도는 비슷했지만 문제 해결 능력이 늘었다는 것이다. 예전 같았으면 시도하다가 손 놓았을 부분을 이젠 여차저차 찾아서 써먹을 줄 알게 된 점은 수확한 자신감이다. 그러나 그 이외는 모두 단점 투성이다. 갈길이 멀지만, 이렇게 하나씩 해보면 닿게 된다.

그렇다고 정처기 실기를 포기하잔 말은 절대 아니다. 비중을 줄이자. 턱걸이로 합격한다는 마인드. 주말 시간에 한번 훑어보는 이론서라고 생각하고 10월 실기 시험까지 내버리지 말자.

1. IntelliJ IDEA & Spring Boot

Java 기반 웹 어플리케이션을 구현할 때 프레임워크는 주로 IntelliJ와 Eclipse를 사용한다. 이전 회사 개발팀이 사용한 IDE가 IntelliJ였기 때문에 실무에서 더 쓰인다고 생각하게 되었고 혼자 알고리즘을 풀거나 프로젝트를 연습할 땐 IntelliJ를 쓴다.(학원에선 Eclipse를 사용하는데, 유료서비스 없이 모든 기능을 사용할 수 있는 장점이 있다. 반면 IntelliJ는 무료버전(Community 버전)의 경우 기능이 제한적이다)

 1) Spring Boot 프로젝트 생성하기

 프로젝트 생성엔 두 가지 방법이 있다. Spring Boot 사이트에서 initializr 을 활용해 압축파일로 받아서 IntelliJ에 바로 open하는 방법 IntelliJ에서 직접 file > project > spring... 으로 프로젝트를 생성하는 방법. 난 전자를 택했고 이유는 패캠에서 들었던 방식과 동일하며 유료 버전이 아니라 직접 생성 시 필요한 plug-in 사용에 제한이 있기 때문이다.

initializr로 Spring Boot를 만들 때 첫 번째 정해줘야 하는 게 Project다. Project는 Maven, Gradle로 나뉜다. 둘은 Java 환경에서 Library를 구동할 수 있게 해주는 plug-in이다. 차이는 Library를 가져오는 방식인 것 같다. 학원에서 Maven으로 배우고 있어 선택했다.

아래 캡쳐 화면 우측의 Dependencies는 내가 쓸 Library이며, 이들은 Framework 생성 시 자동 장착 돼있다.  Lombok은 setter, getter 아노테이션으로 편리성을 더해준다. Spring Web은 웹 어플리케이션을 구현할 거라면 필수로 의존설정 해줘야 되고 Apache Freemarker는 템플릿 엔진으로 자바 객체에서 데이터를 생성해서 템플릿에 넣어주면 freemarker가 템플릿에 맞게 변환해 HTML을 만들어 준다. 나머지 2개는 DB 연동을 위한 MySQL, MyBatis library다. DB연동 dependency는 글의 맨 아래에 설명돼있다.

Spring Boot 버전은 크게 상관없다. default 2.3.3 버전을 썼다. Group ID는 URL을 거꾸로 써주는 게 관례이다. yh.stock.com을 거꾸로 해서 지었다. Description은 연습용이니 default 값 그대로 놔뒀고, Packaging은 Jar밖에 모르기 때문에 그대로 썼다. Java 버전은 8버전, 혹시 버전 확인이 필요하다면 window키 + R 을 눌려 cmd를 검색한 뒤 명령 프롬프트 창에 java -version을 치면 볼 수 있다. (ex. 1.8.0_261 -> 8버전)

설정이 끝나면 하단 GENERATE를 클릭해준다. zip 파일로 다운로드가 완료된다. 원하는 폴더에 압축을 풀어주고 IntelliJ를 실행시켜 open Project를 클릭하고 로컬 폴더에서 해당 폴더를 열어준다. 그럼 project 내 디렉토리는 크게 .idea, .mvn, src로 구분된다. 거의 src 만 사용한다.

 2) 프로젝트 설정(pom.xml, application.properties)

 - pom.xml

 프로젝트가 생성되고 나서, External Libraries 업데이트가 완료될 때까지 기다려야한다. 우측 하단에 process running 표시가 없다면 ctrl + shift + o를 눌려 Maven update를 실행해본다. 완료되면 External Libraries에 jdk  java 라이브러리와 Maven .jar 형식 라이브러리들이 쫙 리스트업 돼 있어야 한다. target 디렉토리도 이때 생성된다. (한동안 process running이 뜨지 않다가 한참을 기다려서 Maven 라이브러리들이 다운로드가 완료되었다. 담번엔 Maven update 단축키를 써볼 예정이다.)

  ※ 프로젝트가 생성된 상태에서 Dependency를 추가해야 될 때

  file > setting > plug-in으로 받는 편이 가장 편하다. 하지만 나처럼 community 버전으로 인해 수동으로 해야될 때가 있다. Maven Repository 사이트를 들어간다. 원하는 dependency를 검색한다. 비슷한 이름이 많을 땐 usage 가 많은 것을 받는다. Maven <dependency>로 시작하는 JSTL 주소 데이터를 복사해서 pom.xml <dependencies> 내에 붙여넣는다. 그리고 같은 화면에 files의 jar 파일까지 다운받아준다.

 plug-in을 안썼기 때문에 dependency를 적용하려면 jar파일을 직접 library에 추가해줘야 한다. 안하면 빨간딱지 붙음. File > Project Structure > Libraries > 플러스 표시 클릭하고 받아둔 jar 파일을 업로드 해준다. OK를 누르고 잊지 말고 ctrl + shift + o를 눌려주면 process running 되면서 plug-in 다운로드 완료! 생각보다 쉽다. 모르면 겁나 어렵다.

 - application.properties

  server port 번호나 freemarker 경로, DB연결 정보 등록과 같이 설정들을 bean으로 만들어주는 곳이다. 처음에는 화면이 비어있고 필요할 때마다 채워주면 된다. Spring Legacy에서 Servlet-config.xml 에 생성하는 <bean> 태그와 비슷한 역할을 하는 것 같다. 

 3) DB 연동 Dependency 설명

-  MyBatis : MySQL을 연결하기 위해 MyBatis를 Spring Boot에 연동시켜야 한다. JDBC를 이용해 Java DB를 연동할 수 있지만 Java 소스와 Query소스가 겹치기 때문에 관리가 어렵다. MyBatis는 XML 형식 파일로 분리시켜 관리하며 id만 호출해서 MySQL 연결 시 연동해준다. 

- MySQL : 보편적인 DB관리 시스템

2. "Hello World" 웹페이지 실행하기

생성된 src / main / java 내 패키지에 HomeController 하나 생성해준다. DispatchServlet을 통해 전달된 요청을 HandlerMapping에서 컨트롤러를 찾을 수 있게 @Controller 아노테이션을 class에 입력해준다. @GetMapping을 이용해 받을 url을 설정해준다. (ex. @GetMapping(value="/home/string"))

Controller에서 총 3개 메서드를 구현해봤다. 첫 번째는 리턴 값으로 파일을 찾지 않고 값을 그대로 출력해주는 @ResponseBody 아노테이션을 이용해 지금 시각을 출력해주는 LocalDateTime.now() 메서드를 실행시켰다. 두 번째는 class 객체를 받아 json 형태로 key, value를 출력하는 방식으로 실행시켰고 마지막은 return 값의 파일명을 프로젝트 내에서 찾아 실행시켜주도록 짰다. 실행파일은 src / main / resources / templates에 home.ftl 파일로 생성했다.(Freemarker 사용) 리턴값이 없으면 static 폴더 내 index.html 파일을 실행시키며 "index"로 되어있어야만 실행한다. default인듯 하다.

@Controller
public class HelloController {

    @GetMapping(value="/home/string")
    @ResponseBody
    public static String homeString() {

        return LocalDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME);
    }

    @GetMapping(value="/home/json")
    @ResponseBody
    public static Home homeJson() {

        Home home = new Home();
        home.message = "home";
        return home;
    }

    @GetMapping(value = "/home/page")
    public static String home() {

        return "home";
    }

    @Setter
    @Getter
    public static class Home {

        private String message;
    }


}