스프링부트

[Spring Boot 3 & Spring Framework 6 마스터하기!] Java Spring Framework 시작하기

jinaenya 2025. 2. 23. 00:07

※ 해당 강의 내용을 필기하고 실습 시 트러블슈팅하는 내용으로 구성됨

※ 강의는 Eclipse 환경이지만, 해당 게시물에선 intelliJ 환경에서 작업

※ Java 17 이상

 

springboot frameowkr과 관련된 용어

Spring Framework

  • Java와 Spring, SpringBboot를 사용하면 Web, Rest API, Full Stack, Microservices 같은 다양한 applications를 만들 수 있음
  • 이런 application 종류와 무관하게, spring framework는 핵심적인 기능을 담당하게 됨
    • spring을 잘 이해하면 spring boot도 잘 이해할 수 있음
    • debugging을 쉽게 할 수 있음
  • 아래의 핵심 용어(Terminology)를 잘 이해하는 걸 목표로 하면서 실습 진행
    • Tight Coupling and Loose Coupling
    • IOC Container
    • Application Context
    • Component Scan
    • Dependency Injection
    • Spring Beans
    • Auto Wiring

Spring Project 시작하기

STEP 1) https://start.spring.io/ 에서 Spring Project 만들기

Check List

✅[Project]가 Maven인지

✅[Language]가 Java인지

✅[Spring Boot]가 3.0.0 이상인 가장 최신의 Release 버전(괄호로 표기되지 않은 버전)인지

✅자신의 목적에 맞게 [Project Metadata]의 Group과 Artifact를 수정했는지

✅그 외에는 기본값으로 잘 두었는지

확인 후, Dependencies 추가 없이 GENERATE

 

[참고 사항]

1. SNAPSHOT 버전은 사용하지 않는 걸 권고. Spring Boot Team이 개발하고 있는 version이므로 학습을 목적으로 할 때는 사용하지 않는 게 좋음.

2. Group ID와 Artifact ID는 패키지 이름과 클래스 이름과 유사함.

 

STEP 2) 생성된 zip 파일을 로컬에서 압축 해제(unzip)하기

STEP 3) IDE(Eclipse든 IntelliJ든)를 실행 및 Project 열기(open)

 

프로젝트를 잘 열게 되면, 해당 내용을 왼쪽 사이드바에서 확인 가능함

 

  • src/main/java : 모든 소스 파일을 보관
  • src/main/resources : 모든 설정 파일을 보관
  • src/test/java : 테스트 코드를 작성

Game Runner를 세 번 반복하여 디자인하면서 Spring Framework 이해하기

반복 1 : 자바 코드로 강하게 결합되게끔 코딩. (Tightly Coupled Java Code)

  • GameRunner class : Game classes들을 내부에서 실행시킬 수 있는 클래스
  • Game classes: Mario, SuperContra, Pacman 등

 

 

 

type 문제가 아니라 class 만들어서 해결해야하는 문제이니, 커서를 MarioGame에 둔 다음에 좌측에 나타나는 알람 버튼으로 처리하기.

 

 

 

그리고 생성한 다음에 game directory를 만든 다음 refactoring(파일 이동) 진행

MarioGame과 동일하게 gameRunner 클래스도 생성

 

  • Tightly Coupling(강한 결합)과 Loosely Coupling(약한 결합)
    • Coupling means that 'How much work is involved in changing sth?'
    • 모든 면에서 coupling 개념이 중요하고, 좋은 SW를 만들 때 특히나 중요함.
      • Tight Coupling 예시
        • engine-car
        • computer
      • Loose Couping 예시
        • wheel-car
        • laptop
    • Only thing constant in technology is change -> Loose Coupling을 추구하게 됨

반복 2 : Loose Coupling-Interfaces

- Java Interface와 Spring Framework가 Loose Coupling에 기여하는 부분을 학습

  • GameRunner Class
  • GamingConsole interface : 특정 클래스 세트에서 수행 가능한 공통 작업을 나타내는 게 인터페이스
    • Game classes:Mario, SuperContra, Pacman 등

 

  • Interface 추가로의 이점
    • AppGamingBasicJava를 변경하지 않은 채로 Java application 실행 가능
    • Interface가 생기면 클래스 세트들에게, <class 명> 다음에 implements <Interface 명>을 덧붙이면 됨.(그리고 인터페이스의 모든 메서드가 해당 클래스에 적용되어 있으면 문제 없음)
    • 강한 결합 대신 느슨한 결합(Losse Coupling)이 되면서, GameRunner class가 특정 게임에 결합되지 않게 됨. 이에 GameRunner class를 수정하지 않아도 되게 변화됨.

반복 3: Loose Coupling - Spring Level 1 Spring Beans Spring framework will manage objects and wiring 

  • JVM(Java Virtual Machine)에서 만들어진 객체(contraGame, marioGame, gameRunner 등)를 생성/결합하는 코드는 직접 작성하되, Spring Framework가 이 모든 객체를 관리하게끔 작업.
  • JVM 안에 Spring Framework가 있고, 그 다음 안에 객체가 있게끔.

 

 

  • Spring이 관리하는 게 Spring Bean이고, @Configuration으로 지정한 설정 클래스에서 메서드를 정의해서 Spring Bean을 생성할 수 있음.
  • 관계를 만들기 위해선 메서드를 호출한다.
  • @Bean
    • Bean에 사용자 지정 이름을 설정할 수 있음
    • 다양하게 Spring context에서 Bean을 검색할 수 있음(context.getBean())
      • Bean의 이름 쓰기
      • Class 이름의 형식을 쓰기
    • Spring에서 관리하는 기존 Bean을 사용해서 새로운 Bean을 만들 수 있음
      (-> 여러 개의 Bean이 발생하면서 Class 이름의 형식을 쓰는 구문은 에러 발생)

  • Spring Container vs Spring Context vs IOC(제어의 역전) Container vs Application Context
    • 전부 다 동일한 의미이며, 클래스와 인풋을 가지고 실행되는 시스템을 만드는 걸 뜻함
    • Spring Container : Spring bean과 bean의 수명주기를 관리함
      • Java 클래스들과 설정 파일은 Spring Container에 input으로 전달하는 것
      • Spring Container의 output은 Ready System
    • Spring Context : JVM 내부에는 '설정해둔 모든 Bean을 관리하는 Spring Context'가 있음.
  1. Bean Factory : Basic Spring Container. 메모리에 심한 제약이 있는 IOT application이 아닌 이상 이걸 고려하진 않음
  2. Application Context : Advanced Spring Container w 'enterprise-specific features'(보통의 enterprise app은 이걸 사용)
    1. web app에 쓰기 쉬움
    2. internationalization 쉬움
    3. Spring AOP와 통합하기 쉬움
    4. web app, web services, REST API, microservices에 사용하는 걸 추천함

(e.g. AnnotationConfigApplicationContext in IntelliJ

 

  • Java Bean vs POJO vs Spring Bean
    • Java Bean(잘 사용 안 함): Classes adhering to 3 constraints:
      • 1: Have public default (no argument) constructors
      • 2: Allow access to their properties using getter and setter methods
      • 3: Implement java.io.Serializable
    • POJO: Plain Old Java Object
      • No constraints
      • Any Java Object is a POJO!
    • Spring Bean: Any Java object that is managed by Spring
      • Spring uses IOC Container (Bean Factory or Application Context) to manage these objects

 

  • Spring Framework로 관리되는 모든 Bean들을 목록으로 확인하는 방법(나열하는 방법)
    • Arrays.stream(context.getBeanDefinitionNames())
                      .forEach(System.out::println);
  • 여러 multiple matching beans가 가능하다면?(여러 bean을 사용할 수 있다면)
    • 여러 개의 일치하는 Bean이 있는 경우
      • 그 중 하나를 기본으로 지정하거나(@Primary)
      • 한정자를 만들면 해결된다(해당 Bean에 @Qualifier를 추가하여 Bean 간에 자동 연결이 가능함)

반복 4: Loose Coupling - Spring Level 2 Spring Annotations Spring framework will create, manage & auto-wire objects

  • Spring은 객체 관리와 자동 연결을 수행함. 하지만 개발자가 객체 생성을 위해 코드를 작성함. Spring이 개발자를 위해 객체를 생성하게 하려면 어떻게 해야하는지?
    • Spring이 관리해주지만 아래 코드처럼 객체를 만드는 건 개발자가 해야 함.
    • Spring이 객체를 생성하게 하는 건 이후에 고려할 것.
@Configuration
public class GamingConfiguration {
    @Bean
    public GamingConsole game(){
        var game = new PacManGame();
        return game;
    }
    @Bean
    public GameRunner gameRunner(GamingConsole game){
        var gameRunner = new GameRunner(game);
        return gameRunner;
    }

}
  • Spring framework가 쉽게 만드는지, 어렵게 만드는지를 학습하면서 고려해볼 것.