SQL Management 툴에서 DB접속 정보를 저장하는 방법에 대해서 알아보았다.

자주 사용하지 않는 툴이라 귀찮아도 매번 서버 주소, 계정, 패스워드를 입력하였는데..이마저도 귀찮아졌다.


1.

보기 > 등록된 서버 선택하면 다음과 같은 창이 나온다.



2.

Local Server Groups 선택 > 오른쪽 마우스 클릭 > 새 서버 등록 선택



3.

Local Server Groups 하위에 등록한 서버가 노출되게 된다.

이후에는 서버 호스트, 아이디, 패스워드를 매번 넣지 않고 더블 클릭을 통해 DB에 접속할 수 있다.


저작자 표시
신고
Posted by nklee

설치


ubuntu 기본 소프트웨어 저장소에 사용할 수 있는 apache가 있다.

1. root 로그인

2. 패키지 관리 툴인 apt-get을 이용하여 apache2를 설치한다. (apache2 설치와 함께 의존하는 프로그램도 함께 설치된다.)

 > apt-get update

 > apt-get install apache2

3. 설치 후 Apache 상태 확인

 > systemctl status apache2

4. Apache 접속

 > hostname -I  명령어를 통해 IP를 알아낸 후 웹 브라우저를 이용하여 http://{IP} 로 접속해보자.

 


Apache Configuration


/etc/apache2/

아파치 설정 디렉토리


/etc/apache2/apache2.conf

아파치 기본 설정 파일


/etc/apache2/ports.conf

아파치 포트 설정 파일


/etc/apache2/sites-available/

virtual host 관리 디렉토리 (아파치에서는 해당 디렉토리를 직접 참조하지는 않는다.)


/etc/apache2/sites-enabled/

virtual host를 이용하기 위한 설정 디렉토리

000-default.conf -> ../sites-available/000-default.conf 와 같이 심볼릭 링크를 이용하여 sites-available 디렉토리 파일을 참조하는 방식으로 사용되어진다.


/etc/apache2/mods-available/, /etc/apache2/mods-enabled/

모듈 설정 디렉토리



로그


/var/log/apache2 디렉토리



시작,중지


root 로그인

service apache2 start

service apache2 stop



버전 확인


apachectl -version



모듈 사용 설정 확인


apachectl -M



Reverse Proxy 설정


mod_proxy 모듈을 이용해 Reverse Proxy 설정을 하겠다.

root로 로그인

a2enmod 명령어를 통해 아래 모듈 활성화

1
2
3
4
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
cs

활성화를 한다고 해서 모듈을 다운로드 받고 설치하는 작업을 하는게 아니다.

단지 mods-available 디렉토리에 존재하는 모듈을 사용 가능한 상태로 만들기 위해 mods-enabled 하위에 심볼릭 링크를 생성한다.


Apache 서버 재시작 하자.

root로 로그인

service apache2 restart



궁금


1. reverse proxy와 forward proxy 차이

대게 인터넷에 떠도는 정보를 얻기 위해서는 브라우저를 키고 도메인을 입력한 후 접속하여 내가 원하는 정보를 취득한다.

여기에 브라우저는 요청자가 되고 정보를 제공하는 웹 서버는 응답자가 된다.

forward proxy는 요청자 앞단에 위치하고 있는 서버를 말하는 것이고 reverse proxy는 응답자 앞단에 위치한다.

여기서 궁금한 것은 reverse라는 단어가 왜 붙었냐는 것인데.. 이유는 아래 흐름을 보면 쉽게 알 수 있다.

server의 전면에 위치하고 있는 reverse proxy는 요청자의 요청을 받아서 서버로 보내주기 때문에 reverse라는 단어가 붙은 것으로 이해하면 되겠다.

L4, L7 스위치도 어찌보면 reverse proxy라고 할 수 있겠다.


2. reverse proxy의 장점

로드 밸런싱 가능

proxy서버에만 방화벽 설정 가능

보안 강화 - 웹 서버가 뚫리면 DB까지 털리지만 proxy서버가 있기 때문에 보안이 강화된다.

요청이 한 곳으로 집중되기 때문에 확장 가능성 (트래픽 감시, 로그 기록)



참고


설치

https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-ubuntu-16-04


모듈 추가

https://www.digitalocean.com/community/tutorials/how-to-use-apache-as-a-reverse-proxy-with-mod_proxy-on-ubuntu-16-04

http://manpages.ubuntu.com/manpages/trusty/man8/a2enmod.8.html

저작자 표시
신고
Posted by nklee

실무에서 elasticsearch 와 연동해야 할 일이 생겼다.

검색을 통해서 알아보니 Spring Data 프로젝트 하위에 Spring Data Elasticsearch 프로젝트가 존재했다.

https://github.com/spring-projects/spring-data-elasticsearch

그 외에 Elasticsearch와 연동 가능한 Java API가 있었지만 Spring Boot를 사용하고 있어 Spring Data를 선택하게 되었다.

선택 이유는 Spring Boot + Spring Data Elasticsearch 통합이 쉽기 때문이다.

      

일단 ElasticSearch와 연동하기 위해선 설치 작업이 선행되어야 한다.

개발 환경이 윈도우라서 난 윈도우 버전을 설치했다.

다른 환경이라고 해서 딱히 설치 과정이 복잡하지 않다. 그저 바이너리 다운로드 받고 압축을 푼 다음 실행만 하면 된다.

설치 방법 : http://lng1982.tistory.com/283


설치가 완료되고 Elasticsearch 서버가 구동되었다면 Spring Data Elasticsearch 셋팅을 해보자.


pom.xml 파일에 dependency 추가해 준다.

1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
cs


모델을 생성하자.

indexName에 추가되어 있는 nklee는 RDB관점에서 봤을 때 데이터베이스와 유사하다.

type은 테이블과 유사하다.

1
2
3
4
5
6
7
8
9
10
11
12
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@lombok.ToString
@Document(indexName = "nklee", type = "phone")
public class Phone {
    @Id
    private int id;
    private String number;
    private String author;
}
cs


Repository를 생성하자.

이 구조 낯이 익다.

Spring Data JPA 도 이와같이 Repository 인터페이스를 상속하는데 Spring Data Elasticsearch 또한 유사하다.

아마도 Spring Data 프로젝트의 모든 서브 프로젝트들이 이와 같은 concept으로 되어 있지 않을까?

1
2
3
4
public interface PhoneRepository extends ElasticsearchCrudRepository<Phone, Integer> {
    Page<Phone> findByAuthor(String author, Pageable pageable);
    List<Phone> findByNumber(String number);
}
cs


Service를 생성하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Service
public class PhoneService {
 
    @Autowired
    private PhoneRepository phoneRepository;
 
    public Phone save(Phone phone) {
        return phoneRepository.save(phone);
    }
 
    public void delete(Phone phone) {
        phoneRepository.delete(phone);
    }
 
    public Phone findOne(Integer id) {
        return phoneRepository.findOne(id);
    }
 
    public Iterable<Phone> findAll() {
        return phoneRepository.findAll();
    }
 
    public Page<Phone> findByAuthor(String author, PageRequest pageRequest) {
        return phoneRepository.findByAuthor(author, pageRequest);
    }
 
    public List<Phone> findByNumber(String number) {
        return phoneRepository.findByNumber(number);
    }
}
cs


이제 Elasticsearch 서버와 연동하기 위한 ElasticsearchTemplate 설정을 해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Configuration
@EnableElasticsearchRepositories
class EsConfig {
 
    @Value("${elasticsearch.host}")
    private String EsHost;
 
    @Value("${elasticsearch.port}")
    private int EsPort;
 
    @Value("${elasticsearch.clustername}")
    private String EsClusterName;
 
    @Bean
    public Client client() throws Exception {
        Settings esSettings = Settings.settingsBuilder()
                .put("cluster.name", EsClusterName)
                .build();
        
        return TransportClient.builder()
                .settings(esSettings)
                .build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
    }
 
    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws Exception {
        return new ElasticsearchTemplate(client());
    }
}
cs


application.properties

1
2
3
4
elasticsearch.clustername=my-application
elasticsearch.host=localhost
elasticsearch.port=9300
logging.config=classpath:logback-spring.xml
cs

나는 클러스터 이름을 my-application 이라고 했다.

Elasticsearch 서버의 config/elasticsearch.yml 파일에서 클러스터 이름을 지정할 수 있다.



이제 준비가 다 되었으니 테스트를 해보자.

Spring Data Elasticsearch를 사용하게 됨으로써 코드의 간결함을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void 데이터저장() {
    Phone phone = new Phone(1"010-1111-1111""nklee");
    Phone testPhone = phoneService.save(phone);
 
    assertNotNull(testPhone.getId());
    assertThat(testPhone.getNumber(), is(phone.getNumber()));
}
 
@Test
public void 조회() {
    Phone phone = new Phone(1"010-1111-1111""nklee");
    phoneService.save(phone);
 
    Phone testPhone = phoneService.findOne(1);
    assertNotNull(testPhone.getId());
    assertThat(testPhone.getNumber(), is(phone.getNumber()));
}
cs


전체 소스 코드는 Github에 올려놨다.

https://github.com/namkyu/test_spring_data


추가적으로 Spring Data Elasticsearch를 사용하기 위해서는 버전에 대해서 염두해야 한다.

Spring Data Elasticsearch 버전에 호환되는 Elasticsearch 서버가 존재한다는 의미이다.


내가 겪었던 문제에 대해서 적어본다.

Spring Data Elasticsearch를 이용해 Elasticsearch 서버와 연동을 하려고 하는데 아래와 같은 오류 메세지를 만났다.

1
org.elasticsearch.transport.ReceiveTimeoutTransportException: [][127.0.0.1:9200][cluster:monitor/nodes/liveness] request_id [0] timed out after [5001ms]
cs

확인해 보니 버전 오류로 발생되는 것이였다.

elasticsearch-5.5.2 버전을 구동하고 spring-data-elasticsearch 버전을 2.1.6.RELEASE 를 이용했기 때문이다.

현재 spring-data-elasticsearch 최신 2.1.6.RELEASE 버전은 Elasticsearch 5.x 버전을 지원하고 있지 않다. (2017-08-31)


[추가]

5.x 지원 가능한 spring-data-elasticsearch RC 버전이 최근에서야 추가된 것을 확인했다.



참고


지원 버전

https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix


버전 관련 질문

https://stackoverflow.com/questions/42001828/does-spring-data-support-elasticsearch-5-x


Spring Data Elasticsearch 프로젝트

https://github.com/wonwoo/spring-boot-elasticsearch


Elasticsearch 기본 설명

http://d2.naver.com/helloworld/273788

https://iju707.gitbooks.io/elasticsearch/content/_introducing_the_query_language.html

https://github.com/spring-projects/spring-data-elasticsearch


예제 코드

https://examples.javacodegeeks.com/enterprise-java/spring/spring-data-elasticsearch-example/

https://www.mkyong.com/spring-boot/spring-boot-spring-data-elasticsearch-example/

http://www.mkyong.com/elasticsearch/elasticsearch-hello-world-example/

저작자 표시
신고
Posted by nklee