[TIL] ElasticSearch와 Spring Boot 연동하기

su·2024년 6월 1일
0

TIL

목록 보기
86/93
post-thumbnail

Spring Boot에서 ElasticSearch 사용하기

1. build.gradle에 의존성 추가

재빌드해서 오류 나는지 안나는지 확인해보기 !

implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'

2. ElasticSearchConfig 파일 생성

2-1. 실패한 코드

이렇게 생성하고 실행했더니 알 수 없는 오류가 계속해서 발생했다..
처음에는 Bean 생성 관련 오류가 계속 발생해서, 이름을 잘못 설정했나 ..?
싶어서 검색해보니 index명에 대문자가 들어가면 안된다고 하더라 ..
난 대문자를 넣은 적이 단 한번도 없는데 왜 ..?

@Configuration
@EnableElasticsearchRepositories
public class ElasticSearchConfig extends ElasticsearchConfiguration {

	@Value("${spring.data.elasticsearch.cluster-name}")
    private String username;
    
    @Value("${spring.data.elasticsearch.cluster-password}")
    private String password;
    
    @Override
    public ClientConfiguration clientConfiguration() {
    	return ClientConfiguration.builder()
        	.connectedTo("localhost:9200")
            .usingSsal(disableSslVerification(), allHostsVaild())
            .withBasicAuth(username, password)
            .build();
    } // clientConfiguration
    
    public static SSLContext disableSslVerificaion() {
    	// SSL 인증서를 체크하지 않도록 설정
        try {
        	TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() {
            	public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }};
        	// trust manager 설치
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

            return sc;
        
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
        	e.printStackTrace();
        }
        return null;
   
    } // disableSslVerificaion
    
    public static HostnameVerifier allHostsValid() {
        // HostnameVerifier 생성(호스트 네임 확인 X)
        HostnameVerifier allHostsValid = (hostname, session) -> true;

        // HostnameVerifier 설치
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        return allHostsValid;
    } // allHostsValid
} // ElasticSearchConfig Class

2-2. 성공한 코드

오류 코드를 끝까지 다 확인해보니, Timeout 관련 오류가 있어서
검색해보니까 메소드를 더 추가해주어야 하더라...

@Configuration
@EnableElasticsearchRepositories
public class ElasticSearchConfig extends ElasticsearchConfiguration {

	@Value("${spring.data.elasticsearch.cluster-name}")
    private String username;
    
    @Value("${spring.data.elasticsearch.cluster-password}")
    private String password;
    
    @Override
    public ClientConfiguration clientConfiguration() {
    	return ClientConfiguration.builder()
        	.connectedTo("localhost:9200")
            .usingSsal(disableSslVerification(), allHostsVaild())
            .withConnectTimeout(10000)
            .withSocketTimeout(30000)
            .withBasicAuth(username, password)
            .build();
    } // clientConfiguration
    
    public static SSLContext disableSslVerificaion() {
    	// SSL 인증서를 체크하지 않도록 설정
        try {
        	TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() {
            	public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }};
        	// trust manager 설치
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

            return sc;
        
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
        	e.printStackTrace();
        }
        return null;
   
    } // disableSslVerificaion
    
    public static HostnameVerifier allHostsValid() {
        // HostnameVerifier 생성(호스트 네임 확인 X)
        HostnameVerifier allHostsValid = (hostname, session) -> true;

        // HostnameVerifier 설치
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);
        return allHostsValid;
    } // allHostsValid
} // ElasticSearchConfig Class

3. Document 생성해보기

물건 관련해서 생성해보자 !

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Document(indexName = "product")
public class ProductDocument {
	
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Field(name = "title", type = FieldType.Text)
    private String title;
    
    @Field(name = "content", type = FieldType.Text)
    private String content;
    
    @Field(name = "price", type = FieldType.Integer)
    private Integer price.
    
    @Field(name = "user")
    private User user;
    
    @Field(name = "created_at", type = FieldType.Date)
    private LocalDateTime createAt;
    
    @Field(name = "updated_at", type = FiledType.Date)
    private LocalDateTime updatedAt;
    
}

일단 여기까지는 문제 없이 잘 실행되었다
해당 Document를 저장하고, 기본적인 CRUD를 완성해봐야겠다 !

profile
(❁´◡`❁)

0개의 댓글