※ 해당 강의 내용을 필기하고 실습 시 트러블슈팅하는 내용으로 구성됨
※ 강의는 Eclipse 환경이지만, 해당 게시물에선 intelliJ 환경에서 작업
※ Java 17 이상
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 등
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
- Tight Coupling 예시
- 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'가 있음.
- Bean Factory : Basic Spring Container. 메모리에 심한 제약이 있는 IOT application이 아닌 이상 이걸 고려하진 않음
- Application Context : Advanced Spring Container w 'enterprise-specific features'(보통의 enterprise app은 이걸 사용)
- web app에 쓰기 쉬움
- internationalization 쉬움
- Spring AOP와 통합하기 쉬움
- 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
- Java Bean(잘 사용 안 함): Classes adhering to 3 constraints:
- Spring Framework로 관리되는 모든 Bean들을 목록으로 확인하는 방법(나열하는 방법)
- Arrays.stream(context.getBeanDefinitionNames())
.forEach(System.out::println);
- Arrays.stream(context.getBeanDefinitionNames())
- 여러 multiple matching beans가 가능하다면?(여러 bean을 사용할 수 있다면)
- 여러 개의 일치하는 Bean이 있는 경우
- 그 중 하나를 기본으로 지정하거나(@Primary)
- 한정자를 만들면 해결된다(해당 Bean에 @Qualifier를 추가하여 Bean 간에 자동 연결이 가능함)
- 여러 개의 일치하는 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가 쉽게 만드는지, 어렵게 만드는지를 학습하면서 고려해볼 것.
'스프링부트' 카테고리의 다른 글
[Spring Boot 3 & Spring Framework 6 마스터하기!] SpringFramework 고급 기능 살펴보기(1) (0) | 2025.03.20 |
---|---|
Spring @Component vs @Bean (0) | 2025.03.12 |
[Spring Boot 3 & Spring Framework 6 마스터하기!] Spring Framework를 사용하여 Java 객체를 생성하고 관리하기 (0) | 2025.02.23 |
[스피링부트 입문 김영한] javax 및 autowire 에러 발생 (0) | 2024.11.20 |
[스피링부트 입문 김영한] 세팅 (0) | 2024.11.19 |