Integer to Date java

JAVA 2021. 11. 1. 16:23

telegram 메시지 관련 작업 중 date 정보가 Integer형태로 넘어오게 되어 있어 해당 정보를 

Date로 변경 하는 소스를 작성 했습니다.

전달 받은 데이터는 1635750028인데 이 값은 국제표준시각(UTC, GMT) 1970/1/1/0/0/0 으로부터 경과한 시각

기준으로 넘겨주는거 같습니다.

실제 자리수는 밀리세컨드 이기 때문에 1000을 곱해 줘서 계산 해줍니다.

 

String myDate= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(1635750028 * 1000L));

반응형
Posted by 질주하는구
,

https://github.com/square/okhttp

 

GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

Square’s meticulous HTTP client for the JVM, Android, and GraalVM. - GitHub - square/okhttp: Square’s meticulous HTTP client for the JVM, Android, and GraalVM.

github.com

 

http호출을 간편하게 할 수 있는 소스

 

연결 중 get방식 파라미터를 추가 해야 하는 경우 HttpUrl을 이용해서 전달하려는 파라미터를 추가 할 수 있습니다.

https://www.googleapis.com/youtube/v3/search?part=snippet&q=kpop+music&key=apikey 이런 정보를 요청하는 경우 아래의 코드 처럼 작업 해주면 됩니다.

 

 

HttpUrl httpUrl = new HttpUrl.Builder()
							 .scheme(API_SCHEME)
							 .host(API_HOST)
							 .addPathSegment("youtube")
							 .addPathSegment("v3")
							 .addPathSegment("search")
							 .addQueryParameter("part", "snippet")
							 .addQueryParameter("q", "kpop+music")
							 .addQueryParameter("key", apikey)
							 .build();
System.out.println(httpUrl.toString());
        	
Request request = new Request.Builder()
							  .url(httpUrl)
							  .get()
							  .build();

반응형
Posted by 질주하는구
,

MultipartEntity 이용한 파일 전송 시 한글이 깨지는 경우 addPart를 하기 전에 해당 정보에 인코딩을 추가 해줘야 합니다.

Charset chars = Charset.forName("UTF-8");
new StringBody("한글입력테스트", chars);

와 같이 데이터 추가 할때 캐릭터셋을 같이 추가 해주면 인코딩 후 전송 하게 됩니다.

MultipartEntityBuilder 을 이용하는 경우

ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
entBuilder.addTextBody("title","한글입력테스트",contentType);
같이 컨텐츠타입을 같이 넣어 줘서 해결 합니다.

반응형

'JAVA' 카테고리의 다른 글

Integer to Date java  (0) 2021.11.01
okhttp 사용(파라미터 전달)  (0) 2021.10.27
maven generate-sources 실행시 에러 발생  (0) 2021.07.21
Entity List To DTO List  (0) 2021.06.29
java datetime 관련 메소드 정리  (0) 2021.05.18
Posted by 질주하는구
,

maven generate-sources 실행 시 아래와 같은 에러가 발생 되는 경우

 

error: illegal character: '\ufeff'
error: class, interface, or enum expected

 

해당 소스의 인코딩 형식을 확인 해야 합니다.

해당 파일의 인코딩 형식이 utf-8+BOM 인 경우 utf-8형식으로 변경 해주면 에러가 발생되지 않습니다.

반응형
Posted by 질주하는구
,

Entity List To DTO List

JAVA 2021. 6. 29. 16:45

목록 정보 조회 후 사용자 화면에 전달하기 위해 entity list를 그대로 전달 했었는데 필드의 정보를 조건에 맞춰서 변경된 값으로 출력 해야 하는 경우가 생겨 dto로 변환 후 전달하기 위해 수정

 

entity 목록 -> dto 목록으로 전환 하는 소스를 작성.

(사이트 정보 목록을 사용자 화면에 노출 할 때 사이트 사용 여부(Y,N)를 사용, 비사용 이라는 글자로 노출 하기 위해 dto로 변환 해서 사용)

EX>

List<SiteInfoDTO> siteList  = dataList.stream().map(SiteInfo::entityToDTO).collect(Collectors.toList());

dataList.stream() --목록을 스트림 으로 변환 
map(SiteInfo::entityToDTO) 스트림에 담긴 SiteInfo 클래스의 entityToDTO 메소드를 이용 변환된 SiteInfoDTO 이 담긴 스트림을 반환
collect(Collectors.toList()) 스트림을 다시 List<SiteInfoDTO> 으로 변환

 

 

반응형
Posted by 질주하는구
,

작업 하면서 필요한 datetime 관련 메소드 정리(계속 추가 예정)

CmmnDateUtil.java
0.01MB

반응형
Posted by 질주하는구
,

spring - tiles 사용

JAVA 2021. 5. 4. 17:12

 spring에 페이지 작업 시 페이지 템플릿을 정의 할때 sitemesh를 사용하고 있었는데 이번에는 tiles를 사용해서 

작업 하기로 하고 관련 정보를 정리 합니다.

(좀더 다양한 layout을 사용 하기 위해서 tiles를 사용할 예정 입니다.)

pom.xml에 tiles관련 내용을 추가 하고 

 

<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>3.0.8</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.8</version>
</dependency>

 

dispatcher-servlet.xml 에 tiles view연동을 위해 아래의 코드를 추가 해줍니다.(기본 적인 beanNameResolver의 order는 아래 추가하는 코드의 order 다음으로 변경 해야 합니다.)

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
<property name="order" value="0" /><!-- 순서를 최우선으로 지정 -->
</bean>

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/layout.xml</value>
</list>
</property>
</bean>

해당 코드 추가 후 layout.xml 파일을 생성 해줍니다.(첨부파일 참조)

 

추가한 파일의 내용중 

/sample/*/*
/WEB-INF/jsp/sample/{1}/{2}.jsp
부분은 /sample/{1}/{2} 으로 생각 하면 됩니다.
modelandview 연결 시 ModelAndView("/sample/hibernate/list"); 와 같이 넘겨주면
jsp>sample>hibernate>list.jsp파일이 호출 되고 해당 파일 호출 시 /WEB-INF/jsp/layout/subLayout.jsp 페이지를 template 파일로 인식하고
동작 하게 됩니다.

 

아래는 설정파일들 캠쳐 화면

 

 

 

layout.xml
0.00MB
subLayout.jsp
0.00MB

반응형
Posted by 질주하는구
,

mybatis연동 시 상태값을 enum으로 설정 시 작업 하는 방법 sql-mapper-config.xml 에 타입 핸들러 설정 및 사용하고자 하는 bean의 데이터를 설정

package utils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import egovframework.comm.TempVO.Status;

public class StatusEnumTypeHandler implements TypeHandler{
	
	private static final Logger log = LoggerFactory.getLogger(StatusEnumTypeHandler.class);

	@Override
	public void setParameter(PreparedStatement ps, int i, Status parameter,
			JdbcType jdbcType) throws SQLException {
		 ps.setInt(i, parameter.getCode());//<-데이터 가공
	}

	@Override
	public Status getResult(ResultSet rs, String columnName)
			throws SQLException {
		int code = rs.getInt(columnName);
        return Status.getEnumByCode(code);//<-데이터 가공
	}

	@Override
	public Status getResult(ResultSet rs, int columnIndex)
			throws SQLException {
		int code = rs.getInt(columnIndex);
		return Status.getEnumByCode(code);//<-데이터 가공
	}

	@Override
	public Status getResult(CallableStatement cs, int columnIndex)
			throws SQLException {
		int code = cs.getInt(columnIndex);
		return Status.getEnumByCode(code);//<-데이터 가공
	}

}

bean에 해당하는 프로퍼티 생성 후 사용

package egovframework.comm;

import java.io.Serializable;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;

public class TempVO implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/** 전송상태 */
	private Status status;
	
	public SendHistVO() {}
	
	public SendHistVO(Status status) {
		this.status = status;
	}
	
	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}
	
	public enum Status {
		FAILED(0, "실패"), WAITING(1, "대기"), RESERVATION(2, "예약"), SUCCESS(9, "성공");
		
		private int code;
		
		private String text;
		
		private Status(int code, String text) {
			this.code = code;
			this.text = text;
		}

		@JsonValue
		public int getCode() {
			return code; //디비에 저장할때 사용
		}

		public String getText() {
			return text;
		}
		
		//디비에서 데이터 가지고 올때 사용
		@JsonCreator
		public static Status getEnumByCode(int code) {
			Status[] values = values();
			for(Status value : values) {
				if(value.getCode() == code) {
					return value;
				}
			}
			return null;
		}
	}
}

TempVO 의 status 값을 mybatis에서 사용하는 경우 StatusEnumTypeHandler 의 메소드를 이용해서 데이터를 가공 해서 가지고 오게 동작 하게 됩니다.

반응형
Posted by 질주하는구
,
spring quartz를 이용해서 스케줄을 생성하고 운영 할때 소스에서 상황에 맞춰서 운영중인 스케줄을 멈추거나 삭제 하거나 해야 하는경우 아래의 소스를 이용해서 처리 가능 합니다. (2대의 서버에서 active<->standby로 스케줄을 운영하는 경우) -임의의 소스 생성
package egovframework.cmmn.vo;

import java.io.Serializable;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

public class SchedulerVO implements Serializable{
	private static final long serialVersionUID = 1L;
	
	private static Scheduler dynamicSch;
	
	private static String jobGroupName = "dynamicScheduler";
	
	public static Scheduler getDynamicSch() throws SchedulerException {
		if(dynamicSch==null){
			dynamicSch = new StdSchedulerFactory().getScheduler();
		}
		return dynamicSch;
	}

	public static String getJobGroupName() {
		return jobGroupName;
	}
	
}
- 동적으로 스케줄 추가
Scheduler dynamicSch 	= SchedulerVO.getDynamicSch();
String jobGroupName	= SchedulerVO.getJobGroupName();
String classPath = "";
String tegerMethod = "";

MethodInvokingJobDetailFactoryBean jobDetailBean = new MethodInvokingJobDetailFactoryBean();

Class targetClass 	= Class.forName(classPath);
							
jobDetailBean.setTargetObject(targetClass.newInstance()); //스케줄 수행할 class파일 설정
jobDetailBean.setTargetMethod(tegerMethod); //실행될 메소드 설정
jobDetailBean.setGroup(jobGroupName); //실행시 그룹명 지정
jobDetailBean.setName(scenarioKey); //스케줄 아이디 지정
jobDetailBean.afterPropertiesSet();

//cronTriger 설정
CronTriggerFactoryBean cronTrigger = new CronTriggerFactoryBean();
cronTrigger.setJobDetail((JobDetail)jobDetailBean.getObject());
cronTrigger.setCronExpression(schTime);
cronTrigger.setName(scenarioKey);
cronTrigger.setGroup(jobGroupName);
cronTrigger.afterPropertiesSet();

//스케줄에 추가할 정보 셋팅
dynamicSch.scheduleJob((JobDetail)jobDetailBean.getObject(), cronTrigger.getObject());
- 동작 중인 스케줄 삭제
Scheduler dynamicSch 	= SchedulerVO.getDynamicSch();
String jobGroupName	= SchedulerVO.getJobGroupName();


//setName에 사용한 정보를 기준으로 삭제 작업 진행
dynamicSch.deleteJob(new JobKey("scenario_"+scenarioVO.getScenarioSeq(),jobGroupName));
- 동작 중인 스케줄 정보 변경
Scheduler dynamicSch 	= SchedulerVO.getDynamicSch();
String jobGroupName	= SchedulerVO.getJobGroupName();

CronTriggerImpl cronTriggerImpl = (CronTriggerImpl)dynamicSch.getTrigger(new TriggerKey("scenario_"+scenarioVO.getScenarioSeq(),jobGroupName));
//동작 시간을 변경
cronTriggerImpl.setCronExpression(scenarioVO.getSchTime());
dynamicSch.rescheduleJob(new TriggerKey("scenario_"+scenarioVO.getScenarioSeq(),jobGroupName), cronTriggerImpl);
반응형
Posted by 질주하는구
,

jackson 사용시 bean 파일의 annotation을 설정해서 데이터 가공을 할 수 있습니다.
(ex: datatables같은 플러그인 사용시 지정된 이름으로 데이터가 넘어가야 하는경우 혹은 담겨 있는 데이터가 보안문제 혹은
스크립트를 깨버리는 문제가 생기는 경우 제외를 위해서)

1. 
/** 유저 일련번호 */
@JsonIgnore
private long userSeq;

userSeq는 json변환시 제외 처리

2. 
/** 하위주소목록 */
@JsonProperty("nodes")
private List<AddrBookGroupVO> address;

JsonProperty 선언시 key값을 넣어 주면 address 데이는 nodes라는 key로 json생성

3.
@JsonProperty(access = Access.WRITE_ONLY, access = Access.READ_ONLY)
private long userSeq;

WRITE_ONLY = getter
READ_ONLY = setter
해당하는 프로퍼티의 getter, setter메소드의 접근권한을 통해서 분리해서 정의 할 수 있습니다.

반응형
Posted by 질주하는구
,