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

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

Spring&SpringBoot

목록 보기
9/16
post-custom-banner

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 / 기획에 관심있지만 고양이는 없는 예비 개발자👋
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 4월 21일

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

답글 달기