본문 바로가기
  • GDSC Ewha Tech Team Blog
3-2기 스터디/Spring 입문

[1주차] 프로젝트 환경 설정, 스프링 웹 개발 기초

by 은비고 2022. 4. 6.

Spring이란?

  • 자바 기반의 웹 어플리케이션을 만들 수 있는 *프레임워크

     *프레임워크 vs 라이브러리
    • 프레임워크: 어떠한 문제를 해결하기 위해 여러 요소들과 메뉴얼을 제공하도록 짜여진 틀
    • 라이브러리: 문제를 해결하는 과정에서 사용할 수 있는 도구들
  • 자바 객체와 라이브러리들을 관리해주며, 톰캣과 같은 *WAS가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있다.

    *WAS(Web Application Server)
    • 웹 서버가 요청을 받으면 어플리케이션과 서버 환경을 필요한 기능을 수행한 후, 그 결과를 웹 서버에게 전달하는 기능을 하는 소프트웨어 프레임워크
    • 웹 서버와 데이터베이스 사이에서 동작하는 미들웨어로써, 컨테이너 기반으로 동작
    *WAS vs WebServer
    • Web서버는 정적인 컨텐츠를 처리 WAS는 동적인 컨텐츠를 처리
    • 서버의 부하 방지, 보안상의 이유 등으로 기능 분리
    *웹 컨테이너
    • 웹 어플리케이션 컨테이너 : 웹 어플리케이션이 배포되는 공간

 

 

  • 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리한다. 객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용한다
  • 제어의 역전 (IOC, Inversion Of Control)
    • **클래스 내부의 객체 생성 -> 의존성 객체의 메소드 호출**이 아닌, **스프링에게 제어를 위임하여 스프링이 만든 객체를 주입 -> 의존성 객체의 메소드 호출**구조. 스프링에서는 모든 의존성 객체를 스프링이 실행될 때 만들어주고 필요한 곳에 주입해준다.
    • 즉, 사용자가 객체를 직접 생성하지 않고 Spring이 대신 객체를 생성 및 컨트롤해준다.
  • 의존성 주입 (DI, Dependary Injection)
    • 어떤 객체(B)를 사용하는 주체(A)가 그 객체를 직접 생성하는게 아니라 객체를 외부(Spring)에서 생성해서 사용하려는 주체 객체(A)에 주입시켜주는 방식
    • 외부(Spring)에서 직접 생성하여 관리하는 경우에는 A와 B의 *의존성이 줄어든다.
    • *의존성: 변경사항이 있는 경우 서로에게 영향을 주는 정도

 

 

Spring Boot란?

  • 스프링(Spring)을 더 쉽게 이용하기 위한 도구
  • User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있었는데 Spring의 많은 부분을 자동화하면서 위와 같은 기능이 생성

스프링 기본 설정 (스프링 부트 기반)

IDE: IntelliJ(권장) 또는 Eclipse 설치

  1. Maven Project vs Gradle Project (요즘 트렌드 → 권장)
    • 필요한 라이브러리를 불러와주고 빌드과정 관리해주는 툴
  2. 스프링 부트 버전 선택
    • SNAPSHOT → 아직 개발 중
    • M 시리즈 → 정식 배포 X
  3. Project Metadata
    • Group: 기업 도메인 명
    • Artifact: 빌드 결과물 (프로젝트명)
    • Dependencies: 어떤 라이브러리를 사용할지
      • Spring Web → 웹 서비스 개발용
      • HTML(웹)을 만들어주는 태블릿 엔진 필요 → Thymeleaf (템플릿 엔진)

스프링 프로젝트 구성요소

src>main/test 로 나누어져 있음 (표준화)

  • main>java:실제 package 및 소스파일
  • main>resources: java외 설정파일 등
  • main>test: testcode (요즘 개발 환경에서 중요)
  • build.grade: 아까 설정했던 스프링 패키지의 기본 내용이 담긴 코드
    • test 라이브러리는 기본적으로 포함
    • 포함된 라이브러리는 모두 maveCentral() 에서 불러옴
  • .gitignore: 필요한 소스코드만 git에 올라가게
  • Tomcat started on port(s): 8080 (http) with context path '’
    • http로 8080포트가 떴다는 뜻
    • localhost: 8080 → ERROR 페이지
    • 프로젝트 환경설정 성공!
    • @SpringBootApplication 실행 > Tomcat이라는 웹 서버 자체 내장 >SpringBoot도 함께 실행
  • 빌드가 JAVA에서 직접 실행되지 않고 Gradle을 통해 진행하는 경우: File>Settings> search Gradle >run 설정 IntelliJ

스프링 라이브러리

  • External Libraries: 설정 외 웹 어플리케이션 만들기 위해서 기본으로 필요한 라이브러리 (ex. starter-web)
    • 의존 관계 관리→우리가 사용하기로 설정한 라이브러리가 실행되기 위해서 필요한 라이브러리들을 Gradle이 직접 땡겨옴 (오른쪽 상단 위 ‘Gradle’ 버튼 클릭 시 의존 관계 확인 가능
    • Spring Boot 라이브러리는 Spring-core를 포함한 모든 세팅을 자동 실현시켜줌
      • spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
        • spring-boot
          • spring-core
        • spring-boot-starter-logging
          • logback, slf4j
      • spring-boot-starter-web
        • spring-boot-starter-tomcat: 톰캣 (웹서버)
        • spring-webmvc: 스프링 웹 MVC
    • log: 현업에서 주로 사용하는 출력 시스템 / 에러 잡는 용(System.out.println X)
      • slf4j: 인터페이스, 실제 로그를 어떤 구현체로 출력할 것인지에 대해서 logback과 함께 사용

Welcome Page 만들기

resources/static/index.html

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta hhtp-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>

→ 정적 페이지 (웹 서버가 웹 브라우저에 파일 그대로 반환)

→ 템플릿 엔진을 사용하면 동적으로 활용 가능

모든 튜토리얼이나 설명서: Spring.io>SpringBoot>버전선택

  • *컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )가 화면을 찾아서 처리한다.
    • 스프링 부트 템플릿엔진 기본 viewName 매핑
    • resources: templates/ +{ViewName}+ .html

참고: spring-boot-devtools 라이브러리를 추가하면, html 파일을 컴파일만 해주면 서버 재시작 없이View 파일 변경이 가능하다. 인텔리J 컴파일 방법: 메뉴> build> Recompile

*MVC 구조 (Model-View-Controller)

  1. 모델: 데이터를 정의하고 비즈니스 로직을 업데이트하며 관리합니다.
  2. 뷰: 사용자에게 보여지는 레이아웃과 화면을 처리합니다.
  3. 컨트롤러: 명령에 대한 응답을 통해 모델과 뷰 부분으로 라우팅합니다

*Controller

  1. 사용자의 요청이 진입하는 지점
  2. 요청에 따라 어떤 처리를 할지 결정 (실질적인 처리는 서비스 [Layered Architecture]에서 담당
  3. 사용자에게 View를 응답으로 반환

→Model과 View 사이를 이어주는 다리같은 존재

Controller Sample

package com.study.hellospring.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello") //웹 어플리케이션에서 /hello 들어오면 이 메소드를 호출
    public String hello(Model model) {
        model.addAttribute("data", "hello!!");
        return "hello"; 
//resoure>template>hello로 가라 (SpringBoot가 다 세팅 완료)//
    }
}
/*main>resources>templates>hello.html*/
    

안녕하세요. 손님

//Controller에 넣어줬던 data 값의 value가 text로 불러와짐


  • 빌드하고 실행하기
    • 콘솔로 이동 > 명령 프롬프트(cmd)로 이동 ($cd로 프로젝트 파일로 이동)
    • ./gradlew > gradlew.bat 를 실행하면 됩니다.
    • (명령 프롬프트에서 gradlew.bat 를 실행하려면 gradlew 하고 엔터를 치면 됩니다.)
    • 빌드 제거하기 > $ gradlew clean build
  •  

정적 컨텐츠

파일을 그대로 전달

resources/static/hello-static.html

<!DOCTYPE HTML>
<html>
<head>
 <title>static content</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
  • 1순위: Controller → hello-static 서치

MVC와 템플릿 엔진

서버에서 변형 후 전달

Controller

@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam(value="name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
 }
}
/*@RequestParam: 기본적으로 required=true*/

View

resources/template/hello-template.html

hello! empty

  • External Libraries: 설정 외 웹 어플리케이션 만들기 위해서 기본으로 필요한 라이브러리 (ex. starter-web)

*API

*API

  • 프로그램들이 서로 상호작용할 수 있도록 도와주는 매개체
  • 1. API는 서버와 데이터베이스에 대한 출입구 역할을 한다. API는 서버와 데이터베이스에 대한 출입구 역할을 하며, 허용된 사람들에게만 접근성을 부여해줍니다.
  • 2. API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다. API는 애플리케이션과 기기가 데이터를 원활히 주고받을 수 있도록 돕는 역할을 합니다.
  • 3. API는 모든 접속을 표준화한다. API는 모든 접속을 표준화하기 때문에 기계/ 운영체제 등과 상관없이 누구나 동일한 액세스를 얻을 수 있습니다.

*Json이라는 데이터 구조 포맷으로 전달

*JSON (JavaScript Object Notation)

  • 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식
  • Javascript에서 객체를 만들 때 사용하는 표현식을 의미한다.
  • JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용한다.
  • JSON은 데이터 포맷일 뿐이며 어떠한 통신 방법도, 프로그래밍 문법도 아닌 단순히 데이터를 표시하는 표현 방법일 뿐이다.

@ResponseBody 문자 반환

>>어노테이션 관련 블로그 [Java] 어노테이션(Annotation) 

 

[Java] 어노테이션(Annotation)

프로그래밍을 하면서 @Override 와 @Test와 같은 어노테이션들을 많이 사용했지만,  그 중요성이나 의미를 깊이 있게 생각해보지는 못했었다.  단순히 컴파일러에게 알려주기 위한 표식정도로 생

hiddenviewer.tistory.com

@Controller
public class HelloController {
 @GetMapping("hello-string")
 @ResponseBody
 public String helloString(@RequestParam("name") String name) {
 return "hello " + name;
 }
}
  • @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님, 리소스 X)

@ResponseBody 객체 반환

@Controller
public class HelloController {
 @GetMapping("hello-api")
 @ResponseBody
 public Hello helloApi(@RequestParam("name") String name) {
 Hello hello = new Hello(); //새 객체 생성
 hello.setName(name);
 return hello;
 } 
 static class Hello {
 private String name;
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 }
}
  • @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환됨 (기본)
  • @ResponseBody 를 사용
    • HTTP의 BODY에 문자 내용을 직접 반환
    • viewResolver 대신에 HttpMessageConverter 가 동작
    • 기본 문자처리: StringHttpMessageConverter
    • 기본 객체처리: MappingJackson2HttpMessageConverter
    • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
  •  

[참고자료]
http://melonicedlatte.com/2021/07/11/174700.html

https://velog.io/@dbfudgudals/was%EB%9E%80

https://goldsony.tistory.com/37

https://developer.mozilla.org/ko/docs/Glossary/MVC

https://velog.io/@surim014/JSON%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://blog.wishket.com/api%EB%9E%80-%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85-%EA%B7%B8%EB%A6%B0%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8/

 

JSON이란 무엇인가?

JSON (JavaScript Object Notation) JavaScript Object Notation라는 의미의 축약어로 데이터를 저장하거나 전송할 때 많이 사용되는 경량의 DATA 교환 형식 Javascript에서 객체를 만들 때 사용하는 표현식을 의미한

velog.io

 

MVC - 용어 사전 | MDN

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고

developer.mozilla.org

 

WAS(Web Application Server)란?

#37 지난 포스팅은 Web 서버에 대해서 포스팅했었습니다. 이번에는 Web 서버와 뗄레야 뗄 수 없는 WAS에 대해서 포스팅을 해보고자 합니다. 1. WAS(Web Application Server)란? 웹 브라우저와 같은 클라이언

goldsony.tistory.com

 

was란?

WEB 인터넷을 기반으로 한 서비스, 정보공유 검색 등이 가능URL(주소), HTTP(통신규칙), HTML(내용)SERVER클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터Web Sever인터넷을 기반으로

velog.io

 

스프링(Spring), 스프링 부트(Spring Boot)란? 개념 정리 - Easy is Perfect

 

melonicedlatte.com

  •  

댓글