본문 바로가기
Spring/Spring Framework

스프링 강한 결합, 느슨한 결합

by chogigang 2023. 2. 17.

 강하게 연관되게GameRunner 와 MarioGame을  구현 

 

package com.in28minutes.learnspringframework.game;



public class GameRunner {

    private MarioGame game;// GameRunner 와 MarioGame 의 강한 결합을 가진것

    public GameRunner(MarioGame game) {

        this.game=game;

    }

    public void runGame() {

        game.up();

        game.down();

        game.left();

        game.right();

    }

}



/*마리오 클래스를 만드는 데에 집중 해보자 마리오 게임을 만들고 게임기로 실행해볼 거다.

강한 결합의 개념을 이해하기 위해 이 예시를 만들어 봤습니다.

*/

 

마리오

package com.in28minutes.learnspringframework.game;



public class MarioGame {



    public  void up() {

        System.out.println("jump");

    }

    public  void down() {

        System.out.println("go into a hole");

    }

    public  void left() {

        System.out.println("stop");

    }

    public  void right() {

        System.out.println("go faster");

    }

}

 

 

 SuperContraGame

package com.in28minutes.learnspringframework.game;



public class SuperContraGame {



    public  void up() {

        System.out.println("up");

    }

    public  void down() {

        System.out.println("down");

    }

    public  void left() {

        System.out.println("left");

    }

    public  void right() {

        System.out.println("right");

    }

}

/*슈퍼콘트라 게임의 임플리먼트는 다른 메소드에서 사용된 임플리먼트와 같습니다.

 *

 * */



package com.in28minutes.learnspringframework;

        import com.in28minutes.learnspringframework.game.MarioGame;

        import com.in28minutes.learnspringframework.game.GameRunner;

        import com.in28minutes.learnspringframework.game.SuperContraGame

        import org.springframework.boot.SpringApplication;

        import org.springframework.boot.autoconfigure.SpringBootApplication;



@SpringBootApplication

public class LearnSpringFrameworkApplication {



    public static void main(String[] args) {

        //SpringApplication.run(LearnSpringFrameworkApplication.class, args);



        //MarioGame game = new MarioGame();

        SuperContraGame game = new SuperContraGame();



        GameRunner runner = new GameRunner(game);

        runner.runGame();

    }

}



/*SuperContraGame 을 하면 컴파일링 에러가 발생

* 게임기 클래스를 열어보면 마리오 게임을 인풋으로 예상하고 있어서

* 이 클래스는 다른 게임으로는 작동하지 않을 겁니다.

* 게임기 클래스는 마리오 게임과 강한 결합을 가진 것입니다.



 강한 결합과 느슨한 결합은 얼마나 많은 수정을 가해야 하는지의 차이입니다.

수퍼 컨트롤 게임에서 마리오 게임으로 바꾸려면 게임기 클래스에 또 많은 수정을 가해야 합니다.

그러니 게임기 클래스는 강한 결합을 가지고 습니다.
 */

 

결합은 일반 생활에서도 매우 중요합니다

 

자동차를 예로 들면, 엔진은 자동차에 강하게  결합되어 있습니다

 

엔진을 교체하려면 많은 노력이 필요합니다

 

바퀴는 자동차에 느슨하게 결합되어 있습니다

 

타이어가 펑크가 나면 쉽게 교체할 수 있습니다.



또 다른 예는 노트북입니다

 

노트북은 어디든 가지고 다닐 수 있지만

 

특정 장소에  강하게 결합되어 있지 않습니다

 

반면 컴퓨터는 움직이기 조금 어렵습니다



훌륭한 소프트웨어를 구축하려면 결합이 매우 중요합니다.



비즈니스 요구 사항, 프레임워크,코드,모두 변합니다 따라서

 

 

가능한 느슨한 결합으로 하는 것이 좋습니다

 

가능한 최소의 코드만 바꾸어 기능을 변경할 때 편하고 유지보수도 

 

좋을 겁니다 

 

 

 

 

연관된 것을 느슨하게하기 Level 1 - 인터페이스

 

package com.in28minutes.learnspringframework.game;


public class SuperContraGame implements GamingConsole { //수퍼컨트롤게임이 게이밍콘솔을 implements 즉 인터페이스 했습니다.


    public  void up() {
        System.out.println("up");
    }
    public  void down() {
        System.out.println("down");
    }
    public  void left() {
        System.out.println("left");
    }
    public  void right() {
        System.out.println("right");
    }
}

 

 

인터페이스를 하면  탈 부착이 쉽고 수정도 쉬워집니다.

 

 

 

연관된 것을 느슨하게하기 Level 2 - Spring Framework

 

 

 

스프링 프레임워크로도 느슨한 결합이 가능합니다

 

객체 하나하나를 만들면서 인터페이스 하면서 번거롭게 하는 것보다

 

스프링 프레임워크가 우리가 만든 객체의 생성과 객체주기를 관리하게 할 수 있습니다.

 

지금 알아볼 건 가장 기본적인 2가지의 이노테이션이 있습니다.

 

@Component 

스프링 프레임워크가 이 이노테이션을 관리하라고 하는 것입니다 즉 스프링 프레임워크가 대신 클래스를 관리하고

대신 인터페이스를 관리하라는 명령어입니다  (위에 import 꼭 같이 넣으셔야 합니다 인텔리제이 쓰면 자동입니다.)

 

@Autowired

필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입하는 녀석입니다.

주로 (생성자, 필드, setter) 랑 같이 사용하고 자동으로  관리를 할 때 사용합니다.

의존성 주입을 할 코드를 찾지 못하면 오류가 걸리는 녀석이기도 합니다.

 

 

package com.in28minutes.learnspringframework.game;


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


@Component//우리가 이 컴포넌트 이 이노테이션을 관리하라고 하는것 즉 스프링 프레임 워크에게 마리오 게임을 관리하라 라는것
//나 대신 인스턴스를 생성하라 명령
public class GameRunner {


    @Autowired//마리오 게임이 컴포넌트라고 했어 그러니까 가서 찾아 그리고 객체 목록에서 찾으면 오토 와이어해 


    private GamingConsole game;
    public GameRunner(GamingConsole game) {
        this.game=game;
    }
    public void runGame() {
        game.up();
        game.down();
        game.left();
        game.right();
    }
}

 

 

package com.in28minutes.learnspringframework.game;
        import org.springframework.stereotype.Component;
@Component//우리가 이 컴포넌트 이 이노테이션을 관리하라고 하는 것이다. 즉 스프링 프레임 워크에게 마리오 게임을 관리하라 라는것

//컨트롤+쉬프트 누르면 자동적으로 임풋을 만들어줌 이 기능을 organized input 기능입니다.

//스프링 프레임워크는 그러면 "어? 컴포넌트가 보이네? 여기다가 마리오 게임 인스턴스 만들게요" 할 것입니다.

public class MarioGame implements GamingConsole {
    

    @Override

    public  void up() {

        System.out.println("jump");

    }
    @Override

    public  void down() {

        System.out.println("go into a hole");

    }
    @Override

    public  void left() {

        System.out.println("stop");

    }
    @Override

    public  void right() {

        System.out.println("go faster");

    }
}
 
 

'Spring > Spring Framework' 카테고리의 다른 글

스프링 프레임워크 중요한 용어  (0) 2023.02.27
의존성주입  (0) 2023.02.27
@Controller와 @RestController +@GetMapping  (0) 2023.02.19
스프링 빈(Spring Bean)  (0) 2023.02.18
스프링 프레임워크의 기본 개념  (0) 2023.02.13