spring.io/guides/gs/messaging-stomp-websocket/#scratch

 

Using WebSocket to build an interactive web application

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

공식 페이지의 가이드를 참고하여 따라 진행..

 

spring에서는 2가지 방식으로 WebSocket을 구현 할 수 있다.

 

1. WebSocket 직접 처리  -> 복잡하다 ! 

2. Stomp 사용 

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
  }

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/gs-guide-websocket").withSockJS();
  }

}

- pub/sub 모델을 따르며, 토픽에 따라 메시지를 전달해야하는 사용자를 구분한다.

- broker 함수로 topic에 대한 prefix과 메시지를 수신하는 handler의 메시지 prefix를 설정해준다.

 

@Controller
public class GreetingController {


  @MessageMapping("/hello")
  @SendTo("/topic/greetings")
  public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(1000); // simulated delay
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
  }

}

- 설정 파트에서 setApplicationDestinationPrefix("/app")으로 설정했기 때문에, 메시지를 보낼 때 

/app/hello로 보내면 handler가 메시지를 수신한다.

 

- 메시지가 수신 된후 지정된 @SendTo("/topic/greetings") 을 구독하는 클라이언트에게 메시지를 전달한다.

 

실행 결과

 

 

'Back-end > spring' 카테고리의 다른 글

의존관계 주입  (0) 2021.02.16
컴포넌트 스캔  (0) 2021.02.08
애노테이션 & XML 기반 설정 사용  (0) 2021.02.08
스프링 컨테이너  (0) 2021.02.08
객체지향 원리 적용  (0) 2021.02.08

의존관계 주입

  • 생성자 주입
  • 수정자 주입(setter)
  • 필드 주입
  • 일반 메서드 주입

생성자 주입

  • 생성자 호출 시점에 딱 1번만 호출 보장
  • 불변, 필수 의존관계에 사용
@Component
public class OSI implements OS {
 private final MR mR;
 private final DP dP;
 
 
 @Autowired // 생성자 위에 선언 
 public OSI(MR mR, DP dP) {
 this.mR = mR;
 this.dP = dP;
 }
}

- 생성자가 1개라면 @Autowired 생략 가능 


수정자 주입 (setter)

  • 선택, 변경 가능성이 있는 의존관계
  • 수정자 메서드 방식 사용
@Component
public class OSI implements OS {
 private MR mR;
 private  DP dP;
 
 
 @Autowired // 생성자 위에 선언 
 public void setMR(MR mR){
 this.mR = mR;
 }
 
@Autowired 
pubilc void setDP(DP dP){
this.dP = dP;
}
}

 


필드 주입

 

  • 필드에 바로 주입하는 방법 
  • 코드가 간결 하지만 ID 프레임 워크가 없으면 아무것도 할 수 없다
  • 스프링 설정을 목적으로 하는 곳에서만 특별 용도로 사용

 


일반 메서드 주입

  • 한 번에 여러 필드를 일반 메서드를 통해 주입 받을 수 있다. 

옵션처리

- 주입할 스프링 빈이 없어도 동작 해야할 때

-> @Autowired (required = false) 

- 기본 옵션은 true : 자동 주입 대상이 없는 경우 오류 발생 

- 그외 @Nullable /  Optional<> 

'Back-end > spring' 카테고리의 다른 글

WebSocket + STOMP  (0) 2021.03.25
컴포넌트 스캔  (0) 2021.02.08
애노테이션 & XML 기반 설정 사용  (0) 2021.02.08
스프링 컨테이너  (0) 2021.02.08
객체지향 원리 적용  (0) 2021.02.08

컴포넌트 스캔

- 설정 정보가 없어도 자동으로 스프링 빈을 등록해주는 기능

- 의존관계 자동 주입 : @Autowired 제공 

 

@Configuration
@ComponentScan
public class AppConfig {

}

- 따로 @Bean으로 클래스를 등록하지 않아도 된다.

- @Component 애노테이션이 붙은 클래스를 스캔하여 스프링 빈으로 등록해줌 

 ( 컴포넌트 스캔 대상이 되도록 각 클래스에 @Component 애노테이션을 붙여주기 )

 

-  직접 @Bean으로 설정 정보를 작성하고, 의존관계를 직접 명시하는 것과 달리 컴포넌트 스캔은 이러한 설정 정보 자체가 없다 

  -> @Autowired : 의존관계 자동 주입 기능 사용 

 

 

 

@Autowired : 의존관계 자동 주입

- 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입

- 기본 조회 전략은 타입이 같은 빈 찾아서 주입

- @Component 애노테이션이 붙은 클래스의 생상자 위에다가 명시 

@Component
public class MSL implements MS{

    private final MR mR;

   @Autowired  
   public MSL(MR mR) {
        this.mR = mR;
    }

 

 

컴포넌트 스캔 기본 대상

  • @Component : 컴포넌트 스캔에서 사용
  • @Controlller : 스프링 MVC 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용 ,  스프링 빈이 싱글톤 유지하도록 추가 처리

'Back-end > spring' 카테고리의 다른 글

WebSocket + STOMP  (0) 2021.03.25
의존관계 주입  (0) 2021.02.16
애노테이션 & XML 기반 설정 사용  (0) 2021.02.08
스프링 컨테이너  (0) 2021.02.08
객체지향 원리 적용  (0) 2021.02.08

애노테이션 기반 

- AnnotationConfigApplicationContext 클래스 사용하며 자바 코드의 설정 정보 넘기기

ApplicationContext applicationContext =
				new AnnotationConfigApplicationContext(AppConfig.class);

 


XML 기반 

- GenericXmlApplictionContext 를 사용하며  xml 설정 파일을 넘기기 

ApplicationContext ac = 
			new GenericXmlApplicationContext("appConfig.xml");

 

- 컴파일 없이 빈 설정 정보 변경 가능 

'Back-end > spring' 카테고리의 다른 글

WebSocket + STOMP  (0) 2021.03.25
의존관계 주입  (0) 2021.02.16
컴포넌트 스캔  (0) 2021.02.08
스프링 컨테이너  (0) 2021.02.08
객체지향 원리 적용  (0) 2021.02.08

스프링 컨테이너

-ApplicationContext

-직접 AppConfig를 사용해 직접 객체생성, DI 대신 스프링 컨테이너 사용

-@Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용

-@Bean이라 적힌 메서드 모두 호출하여 반환된 객체를 스프링 컨테이너에 등록

 

-applicationContext.getBean() 메서드로 스프링빈(객체) 조회 가능 

 

ApplicationContext applicationContext =
				new AnnotationConfigApplicationContext(AppConfig.class);

 

- 스프링 컨테이너는 XML 기반 or 애노테이션 기반 자바 설정 클래스로 만들 수 있다.

- 스프링 컨테이너 생성시 구성정보 지정해줘야함 ( 여기서는 AppConfig.class)

 

 

빈 이름

- 메서드 이름 사용

- 직접 부여 가능  @Bean(name = " " )

      -> 같은 이름일 경우 기존 빈을 덮어버리는 오류 발생 

 

 

모든 빈 출력

- ac.getBeanDefinitionNames() :  스프링에 등록된 모든 빈 이름 조회

- ac.getBean()  :  빈 이름으로 빈 객체 조회

 

 

애플리케이션 빈 출력

- 내부 사용하는 빈 getRole()로 구분

  • ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
  • ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈

 

스프링 빈 조회

- ac.getBean(빈이름, 타입)

- ac.getBean(타입)

 

 

* 상속관계

- Object 타입으로 조회 하면 모든 스프링 빈 조회 가능

-> 부모 타입으로 조회하면 자식 타입도 함께 조회 ( 모든 자바 객체 최고부모 = Object )

'Back-end > spring' 카테고리의 다른 글

WebSocket + STOMP  (0) 2021.03.25
의존관계 주입  (0) 2021.02.16
컴포넌트 스캔  (0) 2021.02.08
애노테이션 & XML 기반 설정 사용  (0) 2021.02.08
객체지향 원리 적용  (0) 2021.02.08

+ Recent posts