반응형

spring boot mongodb connection 및 자동 _class 컬럼 insert 삭제 설정

몽고디비를 연결해주려면 스프링부트에서는 yml 설정에서 추가만 해도 되지만,

object 클래스를 넣어줄떄 자동으로 _class 라는 필드가 추가되게 된다.

_class 를 없애주려면 @Configuraion 으로 mongodb 세팅을 자바 코드로 설정을 해주어야 한다.

 

 

해당 내용은 스프링부트 spring-boot-stater-data-mongodb:2.3.3 RELEASE 버젼,

spring-data-mongodb:3.0.3 RELEASE 이다.

차이점은

spring-data-mongodb 2 버젼은 MongoDatabaseFactory 가 아니라 MongoDbFactory 이다.

3 버젼에서는 MongoDbFactory 가 deprecated 가 되어서 MongoDatabaseFactory 를 사용하자.

@Configuration
public class MongoDBConfig {

    @Value("${spring.data.mongodb.uri}")
    private String mongodb_uri;

    @Bean(name = "mongoTemplate1")
    public MongoTemplate mongoTemplate1()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection1");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate2")
    public MongoTemplate mongoTemplate2()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection2");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

    @Bean(name = "mongoTemplate3")
    public MongoTemplate mongoTemplate3()  {
        MongoClient mongoClient = MongoClients.create(mongodb_uri);
        MongoDatabaseFactory factory = new SimpleMongoClientDatabaseFactory(mongoClient, "collection3");
        MappingMongoConverter converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), new MongoMappingContext());
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));

        return new MongoTemplate(factory, converter);
    }

}

다음과 같이 document 가 여러개이면 document 마다 template 을 나누어서 빈을 등록해준다.

 _class 삭제방법

여기서 _class 를 없애는 방법은 위의 코드와 같이

converter.setTypeMapper(new DefaultMongoTypeMapper(null));

컨버터에 null 을 세팅을 기본으로 해주어야 한다.

 

방법은 여러가지가 있겟지만, 해당 방법이 코드량 적고 각각 document 마다 설정 가능하다는 점이 장점이다.

 

auto localhost 몽고 연결 수정

이대로만 하면 아마 spring boot 가 시작시 자동으로 localhost 27017 로 몽고디비가 연결을 시도한다.

이 점을 수정하려면 시작시에 자동으로 시작되는 class 를 제외시켜주면 된다.

@SpringBootApplication 에 exclude 에 MongoDataAutoConfiguration.class 를 추가해주자.

@SpringBootApplication(exclude = { MongoDataAutoConfiguration.class})
public class MongoApplication {

	public static void main(String[] args) {
		SpringApplication.run(MongoApplication.class, args);
	}

}

yml 파일도 설정해주자

spring:
  data:
    mongodb:
      uri: mongodb://아이디:비번@몽고디비url:27017

 

 

yml 로만 설정을 하게되면 스프링몽고디비 3 버젼에서는 로컬로만 연결이 됐다.

 

해결방법을 찾지 못해도 다음처럼 mongotemplate 을 구성한 이유도 있다.

@Value 로 설정값을 가져와서 연결하는 방법이다.

그래서 실질적으로 어플리케이션이 올라가면서 몽고디비 커넥션을 맺는방식은 아니고 빈을 생성시에 yml 에서 값을 가져와서 mongoTemplate 에 사용을 한다.

yml 에 굳이 계정정보를 넣지 않아도 되지만, 자바코드보다는 yml 에 설정값을 넣는 편이 낫다.

 

 

반응형
반응형

스프링 어플리케이션을 시작할때 어플리케이션이 뜰때 초기 구동시켜줘야하는 코드들이 있을 수 있다.

이 때 해결 방법이

CommandLineRunner, ApplicationRunner, @EventListener  방법으로 초기 실행코드를 구현 할 수 있다.

 

@Component //component scanning에 의한 방식으로 빈을 등록하는 방법 
public class MyCLRunner implements CommandLineRunner {

	@Override 
    public void run(String... args) throws Exception { 
   		System.out.println("CommandLineRunner Args: " + Arrays.toString(args));
    } 
}

또는 @Bean 으로 사용 가능 

@Bean 
public CommandLineRunner myCLRunner() { 
	return args -> System.out.println("Hello Lambda CommandLineRunner!!"); 
}

 

구동시 파라미터를 다음과 같이 받을 수 있다. 아래 방식은 ApplicationRunner 도 동일하다.

$ java -jar target/demo-0.0.1-SNAPSHOT.jar abc 123

2. ApplicationRunner 

CommandLineRunner 와 사용법은 똑같지만 다른 것은 파라미터 타입이 다른것 뿐이다.

ApplicationRunner 가 더 최근에 나온 방식이다.

@Component
public class DemoApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner Args: " + Arrays.toString(args.getSourceArgs()));
    }

}
@Bean 
public ApplicationRunner myApplicationRunner() { 
	return args -> System.out.println("Hello ApplicationRunner"); 
}

 

 

ApplicationRunner가 CommandLineRunner보다 일찍 실행된다.

다음과 같이 만든 초기구동 컴포넌트들이 실행순서가 이슈가 있을 경우 순서를 지정할 수 있다,

@Order(1)
@Component
public class DemoCommandLineRunner implements CommandLineRunner { ...

@Order(2)
@Component
public class DemoApplicationRunner implements ApplicationRunner { ...

3. @EventListener

이벤트 리스너가 최근에 나온 방식(4.2 이후)으로 이벤트를 연결해 초기 구동시 해당 클래스를 실행시킬 수 있다.

@SpringBootApplication public class SpringinitApplication { 
	public static void main(String[] args) { //ConfigurableApplicationContext : ApplicationContext를 코드에 의해서 재구성할 수 있도록 기능을 집어넣은 ApplicationContext. 
      ConfigurableApplicationContext ac = SpringApplication.run(SpringinitApplication.class, args); 
      ac.publishEvent(new MyEvent(ac,"My Spring Event")); 
    } 
    
    @EventListener(MyEvent.class) 
    public void onMyEvent(MyEvent myEvent){ 
    	System.out.println("Hello EventListener : " + myEvent.getMessage()); 
    } 
    static class MyEvent extends ApplicationEvent { 
   		private final String message; //원래 String message는 없는 건데 추가한 것임. 
        public MyEvent(Object source, String message) { 
        	super(source); this.message = message; 
  		} 
        public String getMessage(){ 
        	return message; 
        } 
    } 
}

 

여러개 클래스의 경우 다음과 같이 실행할 수 있다.

@EvnetListener({MyEvent.class, ApplicationReadyEvent.class})

참고문헌https://www.daleseo.com/spring-boot-runners/ [스프링 부트 구동 시점에 특정 코드 실행 시키기] 
https://jeong-pro.tistory.com/206[스프링 부트 애플리케이션에서 초기화 코드 3가지 방법]

반응형
반응형

2.3의 새로운 기능

종속성 업그레이드

Spring Boot 2.3 에 새로 추가된 내용

  • Spring Data Neumann
  • Spring HATEOAS 1.1
  • Spring Integration 5.3
  • Spring Kafka 2.5
  • Spring Security 5.3
  • Spring Session Dragonfruit

또한 가능한 경우 타사 라이브러리의 안정적인 최신 릴리스로 업그레이드했습니다.이 릴리스에서 주목할만한 타사 종속성 업그레이드 중 일부는 다음과 같습니다.

  • Cassandra Driver 4.6
  • Couchbase Client 3.0
  • Elasticsearch 7.6
  • Kafka 2.5
  • Micrometer 1.5
  • MongoDB 4.0

자바 14 지원

Spring Boot 2.3은 Java 14를 지원하면서도 Java 11 및 8과 호환됩니다.

도커 지원

Spring Boot 2.3에는 Spring Boot 응용 프로그램을 Docker 이미지로 패키지화하는 데 도움이되는 흥미로운 새로운 기능이 추가되었습니다.Cloud Native Buildpack을
사용하여 Docker 이미지 빌드를 지원하며목표와작업을통해 Maven 및 Gradle 플러그인에 추가되었습니다.Paketo자바 buildpack는 이미지를 만드는 데 기본적으로 사용됩니다.spring-boot:build-imagebootBuildImage

또한 컨텐츠를 레이어로 분리하여 jar 파일을 빌드하는 기능이 Maven 및 Gradle 플러그인에 추가되었습니다.

Graceful shutdown (정상종료)

4 개의 내장 웹 서버 (Jetty, Reactor Netty, Tomcat 및 Undertow)와 반응 형 및 서블릿 기반 웹 애플리케이션 모두에서 정상 종료가 지원됩니다.유예 기간이 구성되면 종료시 웹 서버는 더 이상 새 요청을 허용하지 않으며 활성 요청이 완료 될 때까지 유예 기간까지 기다립니다.

Liveness and Readiness probes

Spring Boot 2.3은 애플리케이션의 가용성에 대한 기본 지식을 보유하고있어 애플리케이션의 존재 여부와 트래픽을 처리 할 준비가되었는지 추적합니다.확인이 블로그 게시물

스프링 데이터 노이만

Spring Boot 2.3은 수많은 주요 버전 및 드라이버 업그레이드가 포함 된Spring Data Neumann과 함께 제공됩니다.이 릴리스에는 R2DBC에 대한 GA 지원도 추가되었습니다.

다른 변화들

릴리스 노트에문서화되어있는 다른 많은 변경 사항 및 개선 사항이 있습니다.더 이상 사용되지 않는 클래스 및 다음 버전에서 제거 할 메소드 목록도 찾을 수 있습니다.

참고문헌

https://spring.io/blog/2020/05/15/spring-boot-2-3-0-available-now [스프링 2.3블로그 원문]
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes [2.3 릴리즈 노트]

반응형
반응형

STS > File > New > Spring Starter Project
Intellij > File > new > project > Spring Initializr

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootBoilerPlateApplication {
  public static void main(String[] args) {
    SpringApplication.run(SpringBootBoilerPlateApplication.class, args);
  }
}

maven으로 프로젝트 빌드

프로젝트 우클릭 > Run as > maven clean > maven install > maven build.. > Spring boot app 으로 프로젝트 시작

~

~

Application 클래스의 main 메소드가 시작된다.
이 때 해당 클래스 명이 아니더라도 @SpringBootApplication 어노테이션이 있는 클래스의 main 메소드가 실행됨

@SpringBootApplication

어노테이션은 이 3개의 어노테이션을 모두 담고 있는 어노테이션이다.

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

스프링부트가 나오기 전까지는 ViewResolver를 설정하기 위해서 application-context.xml이 servlet-context.xml에
추가하거나, JavaConfig 기반의 환경일 경우, @Configuration 클래스 - WebMvcConfig등의 클래스 - 에 ViewResolver설정을 해줘야 했었다.

먼저 간단한 Controller 클래스를 만드는데, 클래스가 만들어지는 위치가 중요하다.
스프링부트는 메인클래스의 설정에 의해 컴포넌트스캔을 한다고 했었는데,
스프링부트는 컴포넌트 스캔을 할 때, 기본적으로 메인클래스가 있는 위치를 기준으로 스캔을 하게된다.

ComponentScan 

만약, AutoScan이 되어야 하는 컴포넌트 클래스들 - 대표적으로 @Controller, @Service, @Repository, @Component등-의 위치가 메인클래스가 위치한 패키지보다 상위 패키지에 있거나, 하위가 아닌 다른 패키지에 있는 경우, 스캔이 되지 않는다.

이런 문제를 해결하기 위해서는,
명시적으로 ComponentScan을 할 Base Package를 지정해주면 된다.

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
메인클래스에 Annotation을 추가함으로써 SpringBoot시작시 실행되는 Auto Configuration 작업중 DatatSource 설정부분을 제외시킬 수 있다.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})  // Datasource설정은 자동설정에서 제외
@ComponentScan(basePackages = "com.boilerPlate.app")

 

SpringBootApplication문서

 

반응형

+ Recent posts