반응형
public static String getIp(){
    String result = null;
    try {
        result = InetAddress.getLocalHost().getHostAddress();
    } catch (UnknownHostException e) {
        result = "";
    }
   return result; 
}

InetAddress.getLocalHost().getHostName()

을 사용하면 서버에서 hostname 을 찾는것과 같은 이름을 찾는다.

 

 

반응형
반응형

 

hostname

hostname -I

실행 후

아래와 같이 현재 주소 IP 가 나타남

222.111.789.000

 

ip addr show 사용하기

ip addr show

를 치면 많은 주소가 나오는데 이 중 inet 뒤에 있는 ip 주소가 해당 서버의 ip 주소이다.

출력되는 정보가 많다면

ip addr | grep "inet"

으로 inet 문구가 포함된 라인만 출력 할 수 있고,

ip -4 addr

여기서는 ipv4 에 해당하는 내용만 가져올 수 있다.

 

 

 

ifconfig

ifconfig

윈도우의 ipconfig 와 비슷하다.

inet 뒤의 ip 주소가 서버 ip 이다.

 

여기서도 grep 으로 원하는 inet 부분만 찾자

ifconfig | grep "inet"
반응형
반응형

스프링 부트 2.3 버젼부터 spring-data-elasticsearch 버젼도 4 버젼으로 올라가고, 여기서 부터 기존 설정 이 조금 달라졌다.

아래 내용은 버젼명시가 없다면 2.3 버젼부터 사용가능한 버젼이다.

 

소스코드 버젼

spring boot 2.4.3

spring-data-elasticsearch 4.1.3

 

pom.xml dependency 추가

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

 

 

config 설정소스

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository")
@ComponentScan(basePackages = { "com.baeldung.spring.data.es.service" })
public class Config {

    @Bean
    public RestHighLevelClient client() {
        ClientConfiguration clientConfiguration 
            = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();

        return RestClients.create(clientConfiguration).rest();
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(client());
    }
}

spring-data-elasticsearch 4.0.0 이상부터는,
TransportClient 클래스가 Deprecated 되어 RestHighLevelClient 또는 ReactiveRestLevelClients 만 사용 가능하다.

 

예제 상에서는 대부분 

@EnableElasticsearchRepositories 어노테이션을 추가하지만 예제 소스를 직접 만들어본 결과 @EnableElasticsearchRepositories 를 따로 추가해 주지 않아도 됐다.

 

@ComponentScan 는 application 에 추가했다면 안해도 된다.

@EnableElasticsearchRepositories 도 추가 없이 동작확인했지만, 사용하려는 버젼에서 안된다면 추가하자.

 

Document 객체 설정하기

@Setter
@Document(indexName = "blog")
public class Blog {

    @Id
    private String id;
    private String title;
    private String content;

}

@Document 는 내가 넣을 index 테이블이다. @Entity 와 동일하다. 또한 몽고디비의 @Document 와 동일하다.

컬럼의 경우 @Field 를 사용한다.

@Field(type = FieldType.Date)
private Date log_date;

@Field(type = FieldType.Text)
private String log_text;

@Field(type = FieldType.Long)
private Long price;

필드별로 타입을 지정할 수 있다.

당연한 거지만 숫지데이터가 없을 때 null 을 넣어주고 싶은경우 Reference Type 을 넣어주면 된다. Long, Integer 등등

 

원래는 @Document 어노테이션에 매핑 Type 지정이 가능했지만, ES 7.0.0 부터는 Type 이 deprecated 되어 indexName만 설정가능하다.

어차피 6. 버젼에서도 하나의 index 에 하나의 type 만 가능했어서 상관없는 부분이다.

https://www.elastic.co/guide/en/elasticsearch/reference/7.x/removal-of-types.html [타입삭제 레퍼런스]

 

@ElasticsearchReposity 사용

JpaRepository 와 사용이 유사하다.

https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#repositories [repository 문서]

@Repository
public interface BlogEsRepository extends ElasticsearchRepository<Blog, String> {
}

 

사용 예시

@Resource
BlogEsRepository blogEsRepository;

@Test
void test(){
    Blog blog = new Blog();
    blog.setId("1");
    blog.setContent("내용입니다.");
    blog.setTitle("제목입니다.");
    blogEsRepository.save(blog);
}

 

키바나 결과화면

 

엘라스틱 조회 결과

 

 

엘라스틱 구축 하는 방법은 

juntcom.tistory.com/121    [도커로 엘라스틱 구축]

를 참고하자.

 

 

참고문헌

https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.M4/reference/html/#preface [스프링 공식문서]
https://www.baeldung.com/spring-data-elasticsearch-tutorial [elastic 예제소스]

 

 

반응형
반응형

private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글톤을 만드는 방법고 어떻게 만드는 것이 효율적일지 볼 수 있다.

 

싱글톤이란

인스턴스를 오직 하나만 생성할 수 있는 클래스이다.

 

싱글턴을 만드는 방식

생성자는 private 으로 감춰두고, 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 만든다.

방법 1. public static 멤버가 FInal 필드인 방식

public class Single {
	public static final Single INTANCE = new Single();
    private Single() { ... }
    
    public void 메소드동작() {
     ...
    }
}

설명 : private 생성자는 PUBLIC Static final 필드인 Single.INSTANCE 를 초기화할 때 한번만 호출된다.

public 이나 Protected 생성자가 없으므로 Single 클래스가 초기화될때 만들어진 인스턴스가 전체 시스템에서 하나뿐인게 보장된다.

 

혹여나 리플랙션 API 로 private 생성자를 호출할 수 있지만, 이러한 것도 방어하려면 생성자를 수정하여 두번째 객체가 생성되려 할때 예외를 던지게 하면 된다.

 

장점 :

1) 해당 클래스가 싱글턴임을 API 를 보고 바로 알 수 있다.

public static 필드가 final 이라 절대로 다른 객체를 참조 할 수 없다.

2) 간결함

 

2. 정적 팩터리 메서드를 public static 멤버로 제공하자.

public class Single {
	private static final Single INTANCE = new Single();
    private Single() { ... }
    
    public static Single getIntance() { return INTANCE; }
    
    public void 메소드() {
    	...
    }
}

설명 : Single.getIntance 는 항상 같은 객체의 참조를 반환하므로 하나의 객체만 생성된다.

 

장점 :

1) 개발자의 의도가 바뀌면 API를 바꾸지 않고도 싱글톤이 아니게 변경 가능하다.

팩토리 메소드가 호출하는 스레드별로 다른 인스턴스를 넘겨주게 할 수 있다.

 

2) 또한 원한다면 정적 팩터리를 제네릭 싱글턴 팩터리로 만들수 있다.

3) 정적 팩터리의 메소드 참조를 공급자(supplier) 로 사용할 수 있다. 

Single::getIntance 를 Supplier<Single> 로 사용하는 방법이다.

위의 장점들이 필요하지 않다면 방법1 public 필드 방식이 좋다.

 

 

둘 중 하나의 방식으로 만든 싱글턴 클래스를 직렬화하려면 Serializable 을 구현한다고 선언하는 것만으로 부족하다.

모든 인스턴스 필드를 transient 라고 선언하고 readResolbe 메소드를 제공해야 한다.

이렇게 하지 않으면 직렬화된 인스턴스를 역직렬화할 때마다 새로운 인스턴스가 만들어진다.

// 싱글톤임을 보장해주는 READREsolve 메소드
private Object readResolve() {
	// '진짜' Single 를 반환하고 '가짜' 객체 Single 는 가비지 컬렉터에 맡긴다.
    return INSTANCE;
}

 

3. 원소가 하나인 열거 타입을 선언하자

public enum Single {
	INSTANCE;
    
    public void 메소드() {
    	...
    }
}

설명 :

1) 방법 1 Public 필드 방식과 비슷하지만 더 간결하고 추가 노력 없이 직렬화 할 수 있다.

2) 또한 복잡한 직렬화 상황이나 리플렉션에서도 인스턴스가 추가되는 것을 막아준다.

 

대부분의 상황에서는 원소가 하나뿐인 ENUM 타입이 싱글턴을 만드는 가장 좋은 방법이다.

 

 

대신 싱글톤이 Enum 외의 클래스를 상속해야 하면 이 방법은 사용불가 (열거 타입이 다른 인터페이스를 구현하도록 선언할 수는 있다.) 

-> 책에서의 이 말이 이해가 안감........

반응형
반응형

like 검색도 in 처럼 여러개 검색이 가능하다.

 

in 절 처럼 like 여러개 검색하고 싶은 경우

where 컬럼 REGEXP ('문자열1|문자열2|문자열3')

 

반응형
반응형

1. ORDER BY FIELD() 를 사용하여 '자전거'가 첫번째, '비행기'가 두번째, 그외 나머지는 오름차순으로 정렬하기

SELECT 
	product_name
FROM
    COIN
ORDER BY
    FIELD(product_name, '자전거', '비행기') DESC,
    product_name ASC

 

- FIELD 함수의 첫번째 파라미터에 정렬할 컬럼을 넣고, 그 이후 파라미터엔 우선적으로 정렬할 값들을 역순으로 넣어준다.

그리고 FIELD 함수를 DESC정렬 시켜주면 된다.

 

- 원리는 FIELD 함수를 사용하면 첫번째 파라미터의 값과 같은 값이 그 이후 파라미터의 몇번째에 있는지 index값을 반환한다.

즉 이후 파라미터의 첫번째에 있는 '자전거'는 1이 반환되고, 두번째에 있는 '비행기'는 2가 반환이 된다.

같은 값이 없는 나머지는 0이 반환된다.

이것을 DESC정렬하여 우선적으로 정렬되게 한다. 

 

2. order by 에 case 문을 사용

SELECT
	*
FROM 
	table A
ORDER BY 
	CASE WHEN A.product_name = '자전거' THEN 1 
	ELSE
		2
	END

똑같은 원리다. 상위에 정렬 시키고 싶은 내용들을 case 문의 상수값을 작은 숫자로 반환시켜주면 된다.

 

반응형
반응형

jaxb - Java Architecture for XML Binding 

jaxb 라는 xml 를 바인딩하는 라이브러리가 있다.

한마디로 파싱 관련 라이브러리다.

 

JAXB 는 XML 문서정보를 거의 동일한 구조의 오브젝트로 직접 매핑한다.

 

스키마 컴파일은 xjc 라는 명령어로 수행한다.

xsd 라는 xml 로 정의된 문서를 java 오브젝트로 컴파일 하는 작업이다.

 

XJC(JAXB binding compiler) 툴

xjc 도구를 사용하여 XML 스키마 파일을 전체 어노테이션 지정된 Java 클래스로 컴파일할 수 있다.

xjc는 JDK bin 디렉터리에 포함되어 있다.

 

확인하기

1) 내 java jdk 경로

EX) C:\Program Files\Java\jdk1.8.0_191\bin

위 예시 경로에 xjc 가 있는지 확인

2) cmd 커맨드창에 xjc -version 명령어를 통해 xjc가 사용가능한지 확인

 

사용하기

"C:\Program Files\Java\jdk1.8.0_191\bin\xjc" -p 패키지명 파일명.xsd

EX) "C:\Program Files\Java\jdk1.8.0_191\bin\xjc" -p com.example.java start.xsd

위 명령어를 사용하면 start.xsd 라는 xsd 파일이 java pojo(vo) 로 변경된다.

단, 위의 명령어 경우 start.xsd 가 있는 폴더로 이동해서 위 명령어 사용하자.

그러면 해당 폴더에 .java 파일이 우루루 생긴다.

 

docs.oracle.com/javase/7/docs/technotes/tools/share/xjc.html [xjc 옵션 문서]
stackoverflow.com/questions/1650249/how-to-make-generated-classes-contain-javadoc-from-xml-schema-documentation[xsd 밑 xjc 예시]
반응형
반응형

문자열로 된 수식 계산하기

예를 들어 데이터에 "1+1" 이라는 스트링이 넘어올 경우 이 값의 결과값 2 가 필요한 경우가 있다.

이런 경우에 스크립트 엔진을 이용해 문자열을 계산하자 

파싱안하고 스크립트 엔진으로 연산하기

import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;

public class Test {
  public static void main(String[] args) throws Exception{
      ScriptEngineManager mgr = new ScriptEngineManager();
      ScriptEngine engine = mgr.getEngineByName("JavaScript");
      String foo = "30+2";
      System.out.println(engine.eval(foo));
    }
}

 

반응형

+ Recent posts