Spring boot - 2

현곤·2024년 12월 11일

명령어, 옵션을 나누는 구분자

?

파라미터와 파라미터를 나누는 구분자

&

예시 )

/wiseSayings/write?content=내용&author=현곤

RequestParam << 잘 안씀 근데 나는 썼음

@RequestParam(defaultValue = "무명") String author
값을 넣지 않으면 "무명" 이 들어감

GET http://localhost:8080/wiseSayings : 명언들을 조회
SELECT* FROM wiseSaying; << 쿼리문으로 작성하면 이거다

GET http://localhost:8080/wiseSayings/write?content=~~ : 명언을 등록

GET http://localhost:8080/wiseSayings/1 : 명언 번호 조회
SELECT * FROM wiseSaying WHERE id = 1; << 쿼리문 작성


컴파일 옵션 수정

하다보니 modify가 작동하지 않아서 왜 그런가 찾아보니

자바 컴파일러가 메서드 파라미터 이름 정보를 런타임에 반영하지 못하고 있다고 했다
(챗 지피티가)

그래서 어떻게 해? 하고 물어보니 컴파일 옵션을 수정하면 된다고 했다

tasks.withType<JavaCompile> {
	options.compilerArgs.add("-parameters")
}

요거 해주고 또 명시적으로 이름을 추가해줘야 된다고 해서

@GetMapping("/wiseSayings/{id}/modify")
    public WiseSaying modifyItem(
            @PathVariable (name = "id") long id,
            @RequestParam (name = "content") String content,
            @RequestParam (name = "author" ,defaultValue = "무명") String author
    ) {
        WiseSaying wiseSaying = wiseSayingService.findById(id).get();

        wiseSayingService.modify(wiseSaying, content, author);

        return wiseSaying;
    }

PathVariable ,@RequestParam 로 이름도 콕 찝어줬다.

그 전에도 삭제에서 PathVariable 을 사용했는데 찾지 못해서 저런 식으로 id를 찝어줬다


IoC 컨테이너

강의를 듣다가 IoC를 알게 되었는데 이게 뭘까 싶어서 검색해봤다

IoC란?

제어 반전이란 뜻인데
객체의 생성, 생명 주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다 라는 뜻이었다.

또는 (제어의 역전, Inversion of Control)

컴포넌트 의존관계 설명 (Component dependency resolution) ,
설정 (Configuraiton) , 및 생명 주기 (LifeCycle) 를 해결하기 위한
디자인 패턴 (Design Pattern) 이다.

무슨 말인지 모르겠어서 챗 지피티한테 물어보니

전통적으로 객체를 만들고 설정하는 작업은 프로그래머가 직접 코드로 제어,
하지만 IoC 컨테이너는 이 책임을 대신 맡아 객체를 생성하고 필요한 의존성을 주입한다.


IoC 컨테이너란?

컨테이너는 보통 객체의 생명주기를 관리,
생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것

쉽게 말해

IoC 컨테이너는 객체를 생성하고 의존성을 자동으로 연결해 주는 '스마트한 공장'이다!

  • 대표적인 IoC 컨테이너
    • Java : Spring Framework (스프링 IoC 컨테이너)
    • .NET : ASP.NET Core의 Dependency Injection
    • Python : Flask-Injector, Dependency Injection

IoC 컨테이너가 왜 필요한가?

객체가 서로 의존할 때, 각 객체가 직접 다른 객체를 생성하면
코드가 복잡해지고 유지보수가 어려워진다.

하지만, IoC 컨테이너를 사용하면 의존성 관리가 쉬워지고
코드가 더 유연하며 테스트 가능성이 높아진다.


비유로 설명하자면

IoC 없는 경우 )

요리사가 요리를 만들기 위해 모든 재료를 직접 준비하고 손질까지 해야한다.

IoC가 있는 경우 )

요리사가 필요한 재료를 "키친 스태프" 에게 요청하고, 스태프가 준비된 재료를 전달한다.
고로 요리사는 요리에만 집중할 수 있다!

키친 스태프 << IoC 컨테이너


동작 원리

  1. 객체 등록 : 개발자가 IoC 컨테이너에 객체나 클래스의 정보를 등록

  2. 의존성 해결 : 컨테이너가 객체 생성 시 필요한 다른 객체 (의존성) 를 자동으로 주입

  3. 객체 제공 : IoC 컨테이너가 필요한 객체를 반환


예제

@Component
    public class Engine {
        public void start() {
            System.out.println("Engine started!");
        }
    }

    @Component
    public class Car {
        private final Engine engine;

        @Autowired
        public Car(Engine engine) {
            this.engine = engine;
        }

        public void drive() {
            engine.start();
            System.out.println("Car is driving!");
        }
    }

CarEngine 을 필요로 하지만, 직접 생성하지 않는다.

Spring IoC 컨테이너Engine 객체를 만들어 Car 에 주입 (@Autowired) 한다.


Autowired 생략 가능한 경우

  1. 생성자가 하나만 있을 때 (Spring Framework 4.3 이후)
@Component
public class Car {
    private final Engine engine;

    // @Autowired 생략 가능
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("Car is driving!");
    }
}

이 경우에도 Engine 객체는 Spring IoC 컨테이너 에 의해 자동으로 주입된다.

  1. 생략 불가능한 경우

다음과 같은 상황에선 @Autowired 를 반드시 명시해야 한다!

  • (2 - 1) 생성자가 여러 개인 경우
    • 어떤 생성자를 사용할지 모호하기 때문에 @Aurowired 로 지정해야 한다
@Component
public class Car {
    private final Engine engine;

    public Car() {
        this.engine = null; // 기본 생성자
    }

    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }
}
  • (2 - 2) 필드 주입이나 메서드 주입 사용 시
    • 필드나 메서드 주입에서는 @Autowired 를 반드시 붙여야 한다
@Component
public class Car {
    @Autowired
    private Engine engine; // 필드 주입 (권장되지 않음)

    public void drive() {
        engine.start();
        System.out.println("Car is driving!");
    }
}

결론

  • 생성자가 하나만 있을 때@Autowired 를 생략해도 문제가 ❌

  • 다른 방식의 주입이나 복잡한 구성에서는 @Autowired 반드시 명시

생성자 주입 방식을 사용하고, @Autowired 는 필요할 때만 명시적으로 추가하기

profile
코딩하는 곤쪽이

0개의 댓글