SpringBoot(1) 개념, 기본 환경 설정, 배너 및 포트 변경

Yeppi's 개발 일기·2022년 7월 1일
0

Spring&SpringBoot

목록 보기
9/16

1. SpringBoot 란?

1) SpringBoot 사용이유

스프링의 문제점을 해결하고,
스프링 프레임워크를 즉시 사용 가능한 상태로 만들어주는 도구

Spring

  1. POJO 기반의 경량 프로젝트를 개발하도록 환경을 제공
  2. 다른 프레임워크와 통합/조합 가능
  3. 초기에 → 단순한 컨테이너
    현재 → 엔터프라이즈 시스템 개발에 필요한 모든 기술 + 프레임워크 지원 = 거대 플랫폼

👉 스프링은 여러 프레임워크/기술을 지원하면서, 의존성 증가 + 복잡해짐


Spring 의 문제점

  • 스프링은 웹만을 위해 만들어진 프레임워크가 아니다
  • 스프링은 여러 모듈로 구성되어있다
    • 그 중 MVC 아키텍처를 제공하는 MVC 모듈이 있다

👉 즉, 스프링은 범용적인 프레임워크이다

  • 스프링 프레임워크를 웹 애플리케이션을 개발하기 위해선 많은 라이브러리가 필요하다
    • 각 라이브러리마다 버전의 호환성도 맞아야 한다.
    • But, 루비 온 레일즈나 노드의 익스프레스는 웹 애플리케이션 개발을 목적으로 만들어진 것이다.
      • 일일히 라이브러리를 다운받거나 xml 설정하지 않아도 된다.
      • 스프링의 단점을 보완했다.

SpringBoot

  • 그래서 스프링에서도 해당 문제를 보완한 스프링 부트가 출시되었다.
    • 웹 애플리케이션 개발을 목적으로 출시된 것
    • 뼈대, 뼈와 살을 연결하는 xml 파일도 신경쓰지 않아도 됨
    • 오직 살부분(비즈니스 로직)만 집중하도록 함
  • 경량 프로그램, 빠른 애플리케이션 개발 가능




2) SpringBoot 장점

1. 라이브러리 버전 관리 자동화

  • 의존관계에 있는 라이브러리까지 자동으로 관리 해줌
  • jar 파일 형태

2. 자동 설정

  • xml 설정 파일 사라짐

3. 테스트 쉽게 가능

  • JUnit 활용

4. 톰캣 서버 내장 가장

  • 별도로 다운로드 하지 않아도 됨
  • server 의 path 설정의 / 도 자동으로

5. jar 파일을 독립적으로 실행 가능

  • 원래
    war 웹 프로젝트war 파일로 패키징(압축)해서 배포하고,
    계산기같은 프로젝트jar 파일로 패키징(압축)해서 배포한다.
  • war 가 디렉토리 등 훨씬 복잡한 과정을 거쳐 배포
    ⇒ But, 스프링부트는 웹 프로젝트를 jar 파일로 패키징할 수 있음


2. SpringBoot 환경 설정 클래스

Spring boot 는 XML 환경설정 파일을 사용하지않고, 환경 설정 클래스를 사용한다.
이클립스에서 환경 설정 실습을 진행한다.

이 실습은 위에서 배운 SpringBoot 를 개념을 이해하기위한 간단한 실습으로,
제대로된 환경 설정 클래스를 만든 후 등록하는 실습은 다음 장에서 진행하겠다.

<환경 설정 방법1>

  • 클라이언트 파일
    AnnotationConfigApplicationContext container = 
    			new AnnotationConfigApplicationContext(TVConfiguration.class); // 환경 설정 클래스를 로딩한다

  • 환경 설정 파일
  1. 세터 인젝션 사용

    package com.rubypapaer.tv;
    
    import org.springframework.context.annotation.Bean;
    
    // 환경 설정 파일 : xml 설정을 무시
    public class TVConfiguration {
    	// @Bean 이 붙은 메서드는 무조건 실행
    	@Bean
    	public TV tv() { // 기본적인 id 는 자동으로 tv(메서드 이름)로 할당된다
    		SamsungTV tv = new SamsungTV();
    		tv.setSpeaker(speaker());
    		return tv;
    	}
    	
    	// Setter Injection
    	public Speaker speaker() {
    		return new SonySpeaker();
    	}
    }
    • setSpeaker(speaker()); 호출 시 , SonySpeaker() 호출
    • Bean 이 붙은 메서드가 무조건 실행된다
      • tv 메서드가 호출된다
      • 세터 메서드를 통해 SonySpeaker 를 의존성 주입
  2. 타입 인젝션 사용

    @Autowired
    private Speaker speaker;
    • 간편한 방법이다



<환경 설정 방법2>

  • 클라이언트 파일
    AnnotationConfigApplicationContext container = 
          			new AnnotationConfigApplicationContext("com.rubypapaer.tv"); // @Configuration 붙은 클래스를 로딩한다
    • 해당 패키지 경로에 @Configuration 붙은 클래스가 있다면 설정 파일로 인식한다

  • 환경 설정 파일
    • @Configuration@Bean 을 등록한다
          // 환경 설정 파일 : xml 설정을 무시
          @Configuration
          public class TVConfiguration {
          	// @Bean 이 붙은 메서드는 무조건 실행
          	@Bean
          	public TV tv() { // 기본적인 id 는 자동으로 tv(메서드 이름)로 할당된다
          //		SamsungTV tv = new SamsungTV();
          //		tv.setSpeaker(speaker());
          		return new SamsungTV();
          	}
          	
          	@Bean
          	public Speaker speaker() {
          		return new AppleSpeaker();
          	}
          }


  • @Configuration 처럼 메모리에 뜨는 어노테이션들은
    @Component, @Repository, @Service, @Controller 등이 있다

    • 메모리에 뜨기때문에 xml 설정 없이, 편리하게 사용 가능하다
    • ex. 새로 객체 생성되는 코드를 수정하지 않고도 @Service 만으로 사용 가능하다
  • 클라이언트 파일에 환경 설정 불러오는 코드(방법1에서)를
    다시 파일명으로 바꾼 후, 아래처럼 환경설정파일에 @ComponentScan 을 설정하여 동작시킬 수도 있다.
      @Configuration
      @ComponentScan(basePackages = {"com.rubypaper", "com.test"})
      public class TVConfiguration {. . .}


👉 <방법1>보다 <방법2>를 더 권장한다

  • 소스코드를 수정하지 않아도, 객체를 바꿔서 사용할 수 있기 때문이다
    (ex. 애플스피커, 소니스피커)
  • 다만, 내가 만들지 않은 클래스라면? 환경설정 파일에서 Bean 등록을 해주자
    (ex. 전 Spring 실습의 xml 설정과 같음)


3. SpringBoot 기본 설정

STS 에서 실습한다.

1) 프로젝트 생성

  • 자바 표준이 Maven 이므로 Maven 사용하기

  • Spring boot 은 jar 파일로 웹 프로젝트 압축가능하므로, jar 로 설정

  • Group

    • 어떤 기관, 단체가 만들었고 유지보수, 운영 하느냐
    • 전세계적으로 유일한 문자열이여야 하므로, 도메인이름을 뒤짚어서 사용한다
      • ex. [rubypaper.com](http://rubypaper.com) 도메인 → com.rubypaper 그룹명
  • Artifact
    • 프로젝트
    • 프로젝트 Name 설정시 Artifact 로 자동으로 설정됨
  • Description
    • 프로젝트에 대한 설명
  • Package
    • 디폴트 패키지

next 버튼 누른 후

  • 소스 수정 할 때마다 어플리케이션 껐다 키지 않아도 됨
    • 오토 리로딩과 같은 개념

  • Spring Web
    • Spring MVC 등 웹과 관련된 많은 라이브러리 생성

Finsh





2) pom.xml

pom.xml 은 maven 설정 파일이다.

  • dependency 설정 변경
. 
. 
.
	<dependencies>
<!-- 	
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency> -->

<!-- 		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency> -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
			<version>1.18.18</version>
		</dependency>
<!-- 		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency> -->
	</dependencies>

. 
. 
.

  • 이렇게 만약 롬북만 남기고, 나머지 dependency 들을 주석처리하면?
    위 사진처럼 롬북 jar 파일만 남는다
    👉 즉, dependency 하나가 jar 파일(라이브러리) 하나라고 생각하면 된다.

  • starter 를 이용하면, 라이브러리의 묶음으로 설정이 가능하다


  • 프로젝트 생성 후, 라이브러리를 다시 추가하고 싶다면?
    1. pom.xmlctrl+spaceAdd Staters. . .
    2. 원하는 라이브러리 체크 후, next
    3. pom.xml 선택 후 finish

👉 Maven 은 라이브러리 관리를 자동으로 해준다

👉 pom.xmldependency 를 추가하면, dependency 하나당 라이브러리 하나씩 다운로드 해준다





3) 프로젝트 실행 해보기

  • 실행 파일

    @SpringBootApplication
    public class Chapter01Application {
    
        public static void main(String[] args) {
            // web application 으로 실행
            // SpringApplication.run(Chapter01Application.class, args);
    
            // java application 으로 실행
            SpringApplication application = new SpringApplication(Chapter01Application.class); // 자기자신을 인자로 넘겨준다
            application.setWebApplicationType(WebApplicationType.NONE);
            application.run(args);
        }
    
    }
  • web application 으로 실행(기본값)
  • 단순한 java application 으로 실행(톰캣 서버X)

  • 기본 설정 값은 web application 으로 실행되고
    java 어플리케이션 설정에서 SERVLET 으로 해도 web application 으로 동작한다

    @SpringBootApplication
    public class Chapter01Application {
    
        public static void main(String[] args) {
            //SpringApplication.run(Chapter01Application.class, args);
    
            SpringApplication application = new SpringApplication(Chapter01Application.class); // 자기자신을 인자로 넘겨준다
            application.setWebApplicationType(WebApplicationType.SERVLET);
            application.run(args);
    
        }
    }




4) application properties

properties 설정이 자바 설정보다 우선순위가 높다

  • 바로 앞 전 코드(WebApplicationType.SERVLET)에서
    web application 으로 동작하라고 설정한 상태이지만
  • 아래 코드(properties 파일)에서 none 으로 설정했기 때문에
    java application 으로 동작한다.

  • application properties 파일 코드

    # WebApplication Setting
    spring.main.web-application-type=none




5) 배너 설정하기

배너 on/off

  • 기존 배너

  • 자바 메인 실행코드에서 application.setBannerMode(Banner.Mode.OFF);

    • 배너를 출력하지 않는다
  • 마찬가지로 application properties 에 아래처럼 배너가 출력되도록 설정하면?
    배너를 출력하지 않는다는 위 자바 코드는 무시된다.
  • application properties 파일 코드
    # Banner Setting
    spring.main.banner-mode=console


배너 직접 설정

  • 메인 자바 코드에 application.setBannerMode(Banner.Mode.OFF); 설정
  • application propertis
    # Banner Setting
    spring.main.banner-mode=console
    spring.banner.location=banner/banner.txt
  • banner.txt 파일
    • https://patorjk.com/software/taag/ 에서 원하는 디자인 복사

      _____ ____  ____   ____  ____    ____      ____    ___    ___   ______      __ __    ___  ____  ____ ____ 
       / ___/|    \|    \ |    ||    \  /    |    |    \  /   \  /   \ |      |    |  |  |  /  _]|    \|    \    |
      (   \_ |  o  )  D  ) |  | |  _  ||   __|    |  o  )|     ||     ||      |    |  |  | /  [_ |  o  )  o  )  | 
       \__  ||   _/|    /  |  | |  |  ||  |  |    |     ||  O  ||  O  ||_|  |_|    |  ~  ||    _]|   _/|   _/|  | 
       /  \ ||  |  |    \  |  | |  |  ||  |_ |    |  O  ||     ||     |  |  |      |___, ||   [_ |  |  |  |  |  | 
       \    ||  |  |  .  \ |  | |  |  ||     |    |     ||     ||     |  |  |      |     ||     ||  |  |  |  |  | 
        \___||__|  |__|\_||____||__|__||___,_|    |_____| \___/  \___/   |__|      |____/ |_____||__|  |__| |____|
                                                                                                                  
      	
      	${spring-boot.formatted-version}
  • Spring Boot 메인 코드 실행 결과




6) 서버 Port 설정

  • 포트 변경하고 싶을 때
  • application propertis 에서 7077 포트로 변경하면?
     # WebApplication Setting
     spring.main.web-application-type=servlet
     
     # Banner Setting
     spring.main.banner-mode=console
     spring.banner.location=banner/banner.txt
     
     # Servet Settomg
     server.port=7077
  • 만약 port=0 으로 설정하면? 랜덤하게 포트를 생성해준다
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

1개의 댓글

comment-user-thumbnail
4일 전

정리 대박이네요 잘 보고 갑니다.

답글 달기