멀티캠퍼스 백엔드 과정 68일차[9월 12일] - 스프링 부트 및 팀별 조정

GoldenDusk·2023년 9월 13일
0

스프링 부트

개념

스프링 부트(Spring Boot)는 스프링(Spring)을 더 쉽게 이용하기 위한 도구

스프링 이용하여 개발을 할 때, 이것저것 세팅을 해야 될 요소들이 많다. 여러가지를 세팅해야되는 진입 장벽이 존재하여 Spring 을 처음 배우려는 사람들은 중도에 그만두는 경우가 많다고 한다. Spring Boot는 매우 간단하게 프로젝트를 설정할 수 있게 하여, Spring 개발을 조금 더 쉽게 만들어주는 역할을 하고 있으며, 생산성을 위해 많이 사용 된다고 한다.

위의 구조에서 나온 것과 같이 User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있다. 개발자가 실행환경이나 의존성 관리 등의 인프라 관련 등에 쓰는 에너지가 소요하며, 프로그래밍을 하는 데 있어 매우 중요한 비즈니스를 만들기 위한 프로그래밍에 조금 더 에너지를 투입할 수 있게 Spring의 많은 부분을 자동화하였고, 많은 개발자들이 현재 Spring Boot을 이용하여 개발을 진행하고 있다.

🔗 관련 참고 글 : https://melonicedlatte.com/2021/07/12/230800.html

  1. build.gradle 설정
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.2'
    id 'io.spring.dependency-management' version '1.1.0'
}

group = 'com.multicampus'
version = '1.0-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral() //의존성을 받을 저장소를 지정
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web' //spring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}
  1. Main.java

package com.multicampus;

public class Main {
    public static void main(String[] args){System.out.println("메인");}
}
  1. SpringbootDeveloperApplication.java
package com.multicampus.springbootdeveloper;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootDeveloperApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDeveloperApplication.class, args);
    }

}
  1. TestController.java

package com.multicampus.springbootdeveloper;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/test")
    public String test(){
        return "Hello springboot!";
    }
}
  1. build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web' //spring MVC를 사용해서 RESTful 웹 서비스를 개발할 때 필요한 의존성
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    // 스프링 데이터 베이스 JPA
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.h2database:h2' //인메모리 데이터베이스
    compileOnly 'org.projectlombok:lombok' //롬복
    annotationProcessor 'org.projectlombok:lombok'
}

추가용어 설명

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
   //spring MVC를 사용해서 RESTful 웹 서비스를 개발할때 필요한 의존성 모음
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    스프링 어플리케이션을 테스트 하기 위해 필요한 의존선 모음
     'org.springframework.boot:spring-boot-starter-validation'  유효성 검사
     'org.springframework.boot:spring-boot-starter-actuator'   모니터링 기능
    'org.springframework.boot:spring-boot-starter-data-jpa' ORM을 사용할때 필요한 인터페이스 모음 JPA 의존성 주입
    }
  1. 스프링부트는 스프링을 더 빠르고 쉽게 사용하기 위한 도구 , 스타터와 자동구성을 제공

  2. 애너테이션이란 자바소스 코드에 추가하는 표식

  • @기호를 앞에 붙여서 사용   (메타데이터 : 데이터에 대한 설명을 담고 있는 데이터))
  1. @SpringBootApplication 스프링 부트 관련된 설정  @SpringBootConfiguration   + 사용자가 등록한 빈을 읽고 등록하는 @ComponentScan +자동설정으로 등록되는 빈을 읽고 등록 하는 @EnableAutoConfiguration  으로 이루어짐
  • @Component  애너테이션의 클래스는 빈으로 등록되며
  • @Controller, @RestController @Configuration @Repository @Service

모두 @Component 을 가지고 있다.

알맞은 애너테이션을 선택하여 사용한다.

  1. @SpringBootApplication@RestController : 라우터 역할
  • 클라이언트의 요청에 맞는 메서드를 실행할 수 있다.
  • 라우터란 HTTP요청과 메서드를 연결하는 장치@GetMapping("/test") ==> /test GET 요청이 오면 test()메소드 실행해라

내장 sql 이용

  1. Member.java
package com.multicampus.springbootdeveloper;

import jakarta.persistence.*;
import lombok.*;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Getter
@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id", updatable = false)
    private Long id; // db 테이블의 id 컬럼과 매칭
    
    @Column(name="name", nullable = false)
    private String name; //db테이블의 name 컬럼과 매칭
}
  1. TestController.java
package com.multicampus.springbootdeveloper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class TestController {
    @Autowired
    TestService testService;

    @GetMapping("/test")
    public List<Member> getAllMember(){
        // TestService에서 멤버 목록을 가져와서 반환하는 코드 추가
        List<Member> members = testService.getAllMembers();
        return members;
    }
}
  1. TestService.java
package com.multicampus.springbootdeveloper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TestService {
    @Autowired
    MemberRespository memberRepository;

    public List<Member> getAllMembers() {
        return memberRepository.findAll();
    }
}
  1. MemberRespository.java
package com.multicampus.springbootdeveloper;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository //db에서 데이터를 가져오는 퍼시스턴스 계층 역할 : member 테이블에 접근하여 Memver
public interface MemberRespository extends JpaRepository<Member, Long> {
}
  1. application.yml
spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    defer-datasource-initialization: true
  1. data.sql
INSERT INTO member (id, name) VALUES (1, 'name1')
INSERT INTO member (id, name) VALUES (2, 'name2')
INSERT INTO member (id, name) VALUES (3, 'name3')
  1. 포스트맨으로 테스트 가능

  1. 테스트 코드에도 다양한 패턴이 있다.
  • given-when-then 패턴

  • 테스트 코드를 세 단계로 구분해 작성

  • given : 테스트 실행을 준비하는 단계

  • when : 테스트를 진행하는 단계

  • 예시

package com.multicampus.springbootdeveloper;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.awt.*;

public class test {
    @DisplayName("새로운 메뉴를 저장한다.")
    @Test
    public void saveMenuTest(){
        //given : 메뉴를 저장하기 위한 준비 과정
        final String name ="아메리카노";
        final int price = 3000;
        final Menu americano = new Menu(name, price);
        //when : 실제 메뉴를 저장
        final long saveId = menuService.save(americano);
        //then : 메뉴가 잘 추가 되었는지 검증
        final Menu saveMenu = menuService.findById(savedId).get();
        assertThat(saveMenu.getName()).isEqualTo(name);
        assertThat(saveMenu.getPrice()).isEqualTo(price);
    }
}

회고

이 날 많은 일?이 있었다 팀이 4조 => 3조로 줄었다... 이와 관련된 거는 팀 프로젝트 안에다가 회고 써야지 스프링부트랑 스프링은 다른데... 음 뭔 느낌인지 알것 같으면서도 모르겠음

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다.

0개의 댓글