웹/Spring 7

[Spring] 빈 생명주기 콜백

지금까지 배운 스프링 빈의 생명주기는 다음과 같다 : 객체 생성 -> 의존관계 주입. 객체 생성과 의존관계 주입이 다 끝난 후에야 해당 객체의 데이터를 사용할 수 있게 되는데, 이 때 "객체 생성"과 "값의 초기화"를 분리하자는게 생명주기 콜백의 기본 아이디어이다. 개발자가 객체 생성과 의존관계 주입이 다 끝난 시점이 언제인지 알게 하고, 빈의 소멸 직전 타이밍이 언제인지 알게 하여 이 때 필요한 적절한 로직을 넣도록 하는것이 생명주기 콜백의 주요 목표이다.  "객체 생성"과 "값의 초기화" 의 분리가 필요한, 즉 객체 생성과 의존관계 주입이 끝난 시점이 언제인지 알아야 하는 대표적인 예시는 DB 커넥션 연결, 네트워크 커넥션 연결 등 자원의 할당/해제가 필요한 객체를 사용할 때이다. 또한 책임 분리의 ..

웹/Spring 2025.02.10

[Spring] @Autowired

[Spring] Spring Bean[Spring] DI란?강한 결합 vs. 느슨한 결합A 클래스의 함수에서 B 클래스의 함수를 호출할 때를 생각해보자.A 클래스 내에서  b.f() 처럼 호출하려면 B 클래스를 레퍼런스 하기 위한 필드를 가져야 한다brothergiven.tistory.com앞선 포스팅에서 Spring에서 지원하는 3가지 의존성 주입의 방법은 의존성을 주입할 때(생성자, 세터, 필드) @Autowired 애노테이션을 붙임으로써 사용할 수 있다고 하였는데, 이에 대해 더 자세하게 알아보자. ApplcationContext 객체 생성, @ComponentScan(Stereotype Annotation 또는 @Configuration 클래스)를 통해 IoC 컨테이너에 빈을 등록했다. 해당 빈에..

웹/Spring 2025.02.10

[Spring] 싱글톤 컨테이너

싱글톤?스프링으로 작성된 대부분의 프로그램은 웹 애플리케이션이다. 웹 애플리케이션의 가장 큰 특징은 여러 사용자들의 요청을 동시에 처리해야한다는 것인데, 이 때 매 요청 시마다 이를 처리하는 객체를 만들기를 반복하면 엄청난 메모리 누수가 발생할 것임. 따라서 스프링에서는 해당 객체를 하나만 만들어 이를 여러 요청이 공유하도록 한다. 싱글톤 패턴클래스의 인스턴스가 딱 1개만 생성되도록 보장하는 디자인 패턴이다. 객체의 인스턴스를 2개 이상 생성하지 못하도록 막아야 하는데,public class SingletonService{ // 1. static final로 객체를 딱 한 번만 생성한다 private static final SingletonService instance = new Sin..

웹/Spring 2025.02.10

[Spring] Spring Boot

Spring BootSpring Boot를 이용하여 웹 애플리케이션을 처음 개발할 때 설정 파일(application.properties, build.gradle 등등)이 엄청나게 복잡하게 작성된 것을 보고 이런 것들 하나하나를 언제 다 공부하려나 싶었던 때가 있었다. Spring Boot는 Spring Framework를 더 간편하게 사용할 수 있도록 도와주는 프레임워크이다. 애플리케이션의 초기 설정이 훨씬 쉬워지고, 필요한 라이브러리를 빠르게 추가할 수 있다. - 자동 설정(Auto Configuration) 라이브러리가 제공하는 클래스의 Bean 정의와 스프링이 제공하는 각종 기능의 활성화를 자동으로 설정해준다. 즉 자주 사용되는 기능들을 Bean으로 등록하도록 미리 작성해둔 JavaConfig 클..

웹/Spring 2025.02.08

[Spring] Spring JDBC

JDBCJDBC는 Java 애플리케이션이 데이터베이스와 연결하고, 쿼리를 실행하며, 결과를 받아오는데 필요한 API이다. JPA, Hibernate, Spring Data 등의 더 높은 수준의 데이터베이스 접근 라이브러리를 사용하더라도 이들은 JDBC 위에서 동작한다. 즉 해당 라이브러리들도 결국은 JDBC를 사용해 DB와 연결하고 작업을 처리한다. JDBC 기본 사용법import java.sql.*;public class JdbcExample { public static void main(String[] args) { // 데이터베이스 연결 정보 String url = "jdbc:mysql://localhost:3306/mydatabase"; String us..

웹/Spring 2025.02.08

[Spring] Spring Bean

[Spring] DI란?강한 결합 vs. 느슨한 결합A 클래스의 함수에서 B 클래스의 함수를 호출할 때를 생각해보자.A 클래스 내에서  b.f() 처럼 호출하려면 B 클래스를 레퍼런스 하기 위한 필드를 가져야 한다.이를 B b;brothergiven.tistory.com DI 컨테이너Spring Framework의 대표적인 기능이다. 앞선 포스팅에서 DI란 1. 유지보수와 확장에 좋은 느슨한 결합을 하기 위해서2. 두 클래스 사이의 의존성을 클래스 "외부"에서 주입해주는 것3. 다른 클래스를 참조하는 클래스는 해당 클래스의 내부 코드를 모르게 된다.라고 했었는데, Spring에서 DI 컨테이너가 여기서 "외부"의 역할을 해준다 DI 컨테이너는 ApplicationContext라고도 하며(대부분의 DI 컨..

웹/Spring 2025.02.08

[Spring] DI란?

강한 결합 vs. 느슨한 결합A 클래스의 함수에서 B 클래스의 함수를 호출할 때를 생각해보자.A 클래스 내에서  b.f() 처럼 호출하려면 B 클래스를 레퍼런스 하기 위한 필드를 가져야 한다.이를 B b; 로 A 클래스 안에 선언하겠다.class A{ B b; void funcA(){ b.f(); }} 위 코드의 문제는 무엇일까? 바로 레퍼런스 변수 b가 가리키는 객체가 존재하지 않아서 b.f() 호출 시 NullPointerException이 발생한다는 것이다.따라서 b에는 class B또는 class B의 Subclass의 생성자가 들어가야 한다.class A{ B b = new B(); void funcA(){ b.f(); }} 이제 이 코드는 정상적으로 ..

웹/Spring 2025.02.06