[TIL] Day25 - Spring Boot 환경 설정, 프로젝트 / Controller 생성, Annotation

JIONY·2022년 8월 29일
0
post-thumbnail

와 지금까지도 머라머라 치고 실행하면 결과 나오는 게 재밌을 때가 많았는데 Scanner나 sysout 안 쓰고 크롬에서 입출력 다하니까 더 신기햐 ㅋㅋ 초반에 main이 아닌 Controller에서 run을 하는 게 익숙하지 않아서 자꾸 404 에러 화면이 튀어나옴. ? 물음표 백만 개 ^^^^.. 직전 main을 실행하고 있던 거였음 ㅋㅋ 어쨌든 에러는 console에 실마리가 있었다.
이전 강의까지만 해도 java → jsp/servlet → spring(legacy) → spring boot 순으로 수업을 나갔는데 우리부터는 냅다 spring boot를 배우는 걸로 커리큘럼이 업데이트 되었다고 함. 수강생 피드백을 반영한 거라고 하는데 몰?루? legacy도 알긴 알아야 해서 궁금하면 먼저 살펴보라고 참고 자료를 주셨다. 머가 이렇게 많은쥐 ?.?
M1에 오라클 설치하는 게 핵 스트레스였어서 스프링도 속썩일까봐 과제도 미리 제출까지 하고 왔는디 넘 스무스하쥬? ㅋㅋ 실행하려면 단축키 네 개를 ㅋㅋ 눌러야되는게 오바스럽긴 한디 웬만해서는 자주 누를 일이 없을 거 같아서 다행임. devtool 어케 돌아가는 건지는 모르겠지만 자동 재시작? 박수.
오늘 서론이 기네..


String Boot

  • 기존의 Spring을 효율적으로 사용할 수 있도록 최적화 및 간소화한 Framework
  • Spring과 독립적인 버전 체계를 가지며, Spring Boot를 위한 전용 의존성을 따로 관리함
  • 자주 사용하는 3자 라이브러리에 대한 버전도 관리함

스프링 특: 자기만 주목받고 싶어함. 모든 기술을 스프링화 해놨음
스프링 특: apache tomcat 이런 준비물을 갖고 싶지 않음. 원터치 컨셉(일단 구현은 되게 해줄게)


사용 환경

  • Java JDK 11
  • Eclipse STS 4
    • Spring tools 4 for Eclipse 새로 설치
  • Apache Tomcat 9
  • Maven
  • Lombok


프로젝트 생성

  • File > New > Spring Starter Project
  • 팝업에서 생성에 필요한 정보를 설정

1. 기본 정보 입력

  • Service URL: https://start.spring.io (고정)
    • 이클립스가 여기에 입력하는 걸 대신해줌
  • Name: 프로젝트 이름
    • pom.xml을 기반으로 빌드가 되는데, 업데이트 이후에는 이름을 수정해도 이 문서에 반영이 안됨
    • 이름을 잘못 설정한 경우 프로젝트를 삭제하고 다시 생성하는 것이 나음
  • Type: 자바의 빌드 프레임워크(라이브러리 추가와 같이 수동으로 했던 작업을 자동으로 해줌)
    • Maven: 자바 기본 빌드 시스템 ✅
    • Gradle: 안드로이드 기본 빌드 시스템
  • Packaging: 아카이브 종류 선택
    • Jar: 자바 아카이브(외장 서버 이용 불가)
    • War: 웹 아카이브(외장 / 내장 서버 모두 이용 가능) ✅
  • Java Ver: 자바 버전 선택
  • Lang: 언어 선택(자바 외에 자바를 기본으로 한 코틀린, 그루비 선택 가능)
  • Group: 조직 표식(도메인을 역순으로 기재)
    • com.jw라고 임의 설정
  • Arifact: 프로그램 표식(프로젝트와 동일한 이름 사용)
  • Version: 프로그램 업데이트 시에 표시할 버전
    • SNAPSHOT은 개발 중인 버전을 의미함
  • Description: 상세 설명
    • study라고 임의 설정
  • Package: 기본 패키지를 지정해야 함. 이를 벗어나서 패키지를 생성하면 프로젝트로 인정이 안됨(프레임워크 특: 자유도가 낮음)
    • group, artifact를 합쳐서 만듦


2. 의존성(dependency) 추가

  • 우선 spring-web, spring-boot-devtools만 추가해서 학습 예정
  • devtools: 자동 재시작 도구(한 번 켜두면 변경사항이 있을 때마다 auto restart, console창에서 확인 가능)


3. 미리보기

  • start.spring.io에서 프로젝트를 생성했다면 어떻게 나왔을지 미리보기

4. 생성 완료

  • 프로젝트 생성이 완료되면 Package Explorer > 프로젝트 이름 옆에 [boot]표시 노출
    • 첫 생성 시에만 다운로드에 시간이 약간 소요됨


프로젝트 실행

  • Spring Boot App으로 실행
    1. main 메소드를 찾아서 실행하거나,
    2. 프로젝트 이름 우클릭 > Run As.. > Spring Boot App

서비스 포트 충돌 에러

Web server failed to start. Port 8080 was already in use.
  • 오라클이 켜져 있으면 동시에 8080 포트를 사용할 수 없기 때문에 둘 중에 하나의 포트 번호를 변경해야 함. (오라클은 1521, 2030, 8080 세 개의 포트를 사용)
    • 오라클의 서비스 포트를 변경하는 방법

      --sqldeveloper > system 계정에서 설정
      select dbms_xdb.getHttpport() from dual; //현재 포트 번호 확인
      exec dbms_xdb.setHttpport(9090); // 서비스 포트 변경
    • 스프링의 서비스 포트를 변경하는 방법
      - 프로젝트 생성 시마다 변경 필요

      //src/main/resources > application.properties
      //서버를 꺼놓고 바꾸는 것 권장
      server.port=8888;
  • 포트 위키 5번에서 포트 번호의 구분과 범위 참고 가능

런타임 에러

  • maven update 시, 대부분 해결됨
    • 프로젝트 이름 우클릭 > maven > update project (Alt + F5)

나는 프로젝트 생성 후 실행 > stop > github에 commit > 실행 시 100%로 이 에러가 발생함ㅋㅋ



프로젝트 구조

src

  • 프로젝트를 구성하는 source 파일이 위치하는 곳
  • 용도에 따라 다양하게 구분
  • src/main : 배포될 프로젝트에 포함되는 내용들이 위치하는 곳
    • src/main/java : Java Source File이 위치하는 곳
      • Boot00Application.java : Spring Boot App이 시작하는 main 파일
      • ServletInitializer.java : Web Container에 배포될 경우 운영 설정 파일
    • src/main/resources : 설정파일과 정적 콘텐츠가 위치하는 곳
      • static : 정적 컨텐츠 파일의 위치(ex : 이미지, 스크립트 등)
      • templates : Thymeleaf 등 HTML 기반 템플릿 파일의 위치
      • application.properties : Spring Boot 중앙 설정파일(yml로 치환가능)
    • src/main/webapp : (구) 설정파일의 위치. (현) JSP 파일의 위치
  • src/test 배포될 프로젝트에 포함되지 않는 테스트 코드가 위치하는 곳
    - TDD(테스트 주도 개발, Test-Driven Development): 테스트 코드를 먼저 작성하는 개발 방법론

pom.xml

  • maven 중앙 설정 파일
  • 프로젝트의 정보와 의존성, 빌드 방식에 대한 상세한 정보가 기술되어 있음
  • <> 태그: 기록해두고 싶은 것들을 태그와 태그사이에 둠</>
  • : 스프링 부트에서 설정
  • : 내가 설정한 것
    • maven update project를 실행하면 여기에서 정보를 찾아 update함
  • : 프로젝트에 필요한 라이브러리 정리 ⭐
    - 하위에 를 하나씩 작성
    - 스프링 부트는 의존성을 묶어서 통합 의존성으로 관리하기 때문에 하나를 부르면 몇 십개를 한 번에 불러올 수 있음


Annotation

  • 클래스와 메소드의 역할을 지정(특별한 의미 / 다양한 기능을 부여)
  • Spring Framework는 Java의 Annotation을 활용해 해당 클래스의 역할 설정 / Bean 주입 / getter & setter 자동 생성 등을 처리
  • 장점: 코드량 감소 / 생산성 증가 / 용이한 유지보수


@Controller

  • Spring에게 해당 Class가 Controller의 역할을 한다고 명시하기 위해 사용


@RequestMapping

  • @RequestMapping(key = value)와 같은 형태로 작성
  • 들어온 요청을 특정 메소드와 클래스에 매핑하기 위해 사용하는 것
  • Controller 객체 안의 메소드와 클래스에 적용 가능
    - Class 단위에 사용하면 하위 메소드에 모두 적용됨
    - 공용 주소를 클래스 위에 한 번만 적고 아래부터 생략할 수 있음
        ```java
        @Controller
        @RequestMapping("/calculate") //공용 주소
        public class ParamController {
        }
        ```
        
    - 메소드에 사용하면 해당 메소드에서 지정한 방식으로 URI를 처리

@ResponseBody

  • 메소드에서 리턴되는 값이 View로 출력되지 않고 HTTP Response Body에 직접 쓰여지게 됨


@RequestParam

  • URL에 전달되는 파라미터를 메소드의 인자와 매칭시켜, 파라미터를 받아서 처리
  • 파라미터가 2개 이상인 경우, 파라미터마다 붙여줘야 함
    @RequestMapping("/bmi")
    @ResponseBody
    public String bmi(@RequestParam double cm, @RequestParam double kg) {
    }
  • RequestParam이 두 개 이상인 경우 요청할 때 &(Ampersand)로 데이터 구분
    http://localhost:8888/calculate/bmi?cm=180&kg=80

* Annotation

Controller 생성

Controller

  • 접속 처리 도구
    • 특정 URI로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의함
  • DB 테이블 당 하나 만드는 것을 권장


RequestMapping

  • Controller에는 RequestMapping과 고유 주소가 반드시 있어야 함
    • 고유 주소를 메소드 이름으로도 사용하면 네이밍이 편해짐
  • Controller 하나에 RequestMapping, ResponseBody 여러 개 생성 가능


RequestParam

  • Request Parameter: 사용자가 주소에 첨부하는 데이터(쿼리 스트링(query string))
    - 주소 뒤에 ?를 찍고 key=value 형태로 첨부
    ```
    http://localhost:8888/age?year=2000
    //파라미터 이름(key): year, 인자(value): 2000
    ```

@Controller
@RequestMapping("/calculate")
public class ParamController {
	@RequestMapping("/age")
	@ResponseBody
	public String age(@RequestParam int birth) {//입력
		int age = 2022 - birth + 1;//처리
		return "나이 : " + age;	//출력
	}

	@RequestMapping("/calendar")
	@ResponseBody
	public String calendar(@RequestParam int year, @RequestParam int month) {
		Calendar c = Calendar.getInstance();
		c.set(year, month - 1, 1);
		int max = c.getActualMaximum(Calendar.DATE);
		return year + "년 " + month + "월은 " + max + "일";
	}
}


출력 in 브라우저

  • 브라우저 주소창에 http://localhost:포트번호/test 입력 > 클래스에 작성한 내용이 브라우저 화면에 출력됨


브라우저 에러

  • Whitelabel Error Page, 404
  • 주소가 정확하지 않을 때 발생
    • 주소 양식, 포트 번호, 파라미터 확인
  • ⭐ main이 아니라 Controller를 띄워놓고 실행하기 때문에 서버 연결을 종료했다가 그냥 다시 run을 하면 직전 main이 실행됨. 새 Controller의 작업을 브라우저에서 확인할 수 없음(404 error)
    • 서버 연결을 종료한 뒤에 다시 실행할 때는 새 프로젝트를 run 해야 함
    • console > restartedMain 로그 아래쪽 / Boot Dashboard에서 실행 중인 프로젝트 이름 확인 가능



URL 구조

프로토콜

  • 컴퓨터 내부에서, 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는 규칙 체계
  • http vs. https: 암호화 추가 여부
    - http는 보안에 취약하므로 개인정보와 같이 민감한 데이터를 주고받을 때에는 https 이용 권장


호스트

  • 서버의 위치(IP)
  • 내 PC: localhost / 127.0.0.1
  • 일반 IP: xxx.xxx.xxx.xxx (숫자로 구성 / IPv4)
  • IP 또는 별칭 사용


포트

  • 프로그램 번호
  • 0~65535 사이의 번호 부여
  • 80: 웹 서비스 기본 포트(생략 가능)


경로

  • 서버 내 페이지의 위치(@RequestMapping)
  • 기본 주소 뒤에 상세 주소로 붙임
  • ex. /test


구분기호

  • ?(URI에 단 하나만 존재 가능)


파라미터

  • 사용자가 주소에 첨부하는 데이터(query string)
  • key=value(@RequestParam)

* URI vs. URL


0개의 댓글