2015년 10월 13일 화요일
2015년 10월 8일 목요일
spring jpa의 @NamedQuery, @NamedNativeQuery 연습
jpa에서.. repository를 이용하여 findAll이나.. findOneBy.... 시리즈를 써서 데이타를 조회 할수 있지만
아래와 같이 특정 쿼리를 직접 입력하여 이용도 가능합니다.
/classes/META-INF/orm.xml
또는.. 아래와 같이 Entity 클래스에 선언가능하다. (전 xml을 선호..)
% named-query와 named-native-query의 차이점
- named-query는 현재 코드내에 선언한 Entity를 기준으로 쿼리를 날린다. (Inter.java파일 참고)
- named-native-query는 db에 직접 쿼리를 날린다. (그러므로 result-class를 지정해야 한다.)
Inter.java
아래와 같이 특정 쿼리를 직접 입력하여 이용도 가능합니다.
/classes/META-INF/orm.xml
select i from Inter i where i.internameko = ?1
select a.inter_seq, a.inter_name_ko, a.inter_name_en from tb_inter a where a.inter_name_ko = ?
또는.. 아래와 같이 Entity 클래스에 선언가능하다. (전 xml을 선호..)
@Entity @Table(name="tb_inter")
@NamedQuery(name = "User.findByAlal2",
query = "select i from Inter i where i.internameko = ?1")
public class Inter {
....
}
(비슷한 속성으로는 @Query도 사용가능하고. 이 속성은 Repository에 선언합니다.)% named-query와 named-native-query의 차이점
- named-query는 현재 코드내에 선언한 Entity를 기준으로 쿼리를 날린다. (Inter.java파일 참고)
- named-native-query는 db에 직접 쿼리를 날린다. (그러므로 result-class를 지정해야 한다.)
Inter.java
@Entity @Table(name="tb_inter")
public class Inter {
@Id @Column(name = "inter_seq") @GeneratedValue(strategy = GenerationType.AUTO)
private Integer interseq;
@Column(name = "inter_name_ko") @Expose
private String internameko;
@Column(name = "inter_name_en") @Expose
private String internameen;
}
2015년 10월 7일 수요일
spring jpa 조회 연습
entity 작업에 조회까지.. 테스트 해봤습니다.
- 테이블의 관계가 아래와 같을때 상황
tb_member -< tb_member_inter >- tb_inter
-< tb_image
조회 조건
1. Member를 가져오면.. member의 이미지들과... inter의 목록을 함께 가져오도록
2. inter의 상세 정보는 tb_inter에 있음 (가져올때 조인해서..)
아래 class들 간략 설명
. MemberInter의 PK가 두개이므로. 위와 같이 클래스를 하나 만들어서 @IdClass를 지정해야 함
. @Expose 는 Gson관련하여 화면에 뿌릴 필드를 정하는 옵션입니다. jpa와는 무관합니다.
. MemberInter.class에서 많이 헷갈렸습니다. (@ManyToOne)
-- @JoinColumn을 추가로.. 써야 합니다.
-- optional을 true로 하면 join시 outer join을 합니다. (false는 inner join)
FetchType.EAGER -> 즉시 조회해서 데이타 채움
FetchType.LAZY -> 필요시 DB조회
##나중에 추가됨
- 필드명은 카멜케이스CamelCase를 꼭 써야 한다. 안그럼 나중에 method named query 시에 곤란해진다...
Member.java
MemberRepository.java
Image.java
Inter.java
MemberInter.java
MemberInterPk.java
test 코드...
TestServiceTest.java
- 테이블의 관계가 아래와 같을때 상황
tb_member -< tb_member_inter >- tb_inter
-< tb_image
조회 조건
1. Member를 가져오면.. member의 이미지들과... inter의 목록을 함께 가져오도록
2. inter의 상세 정보는 tb_inter에 있음 (가져올때 조인해서..)
아래 class들 간략 설명
. MemberInter의 PK가 두개이므로. 위와 같이 클래스를 하나 만들어서 @IdClass를 지정해야 함
. @Expose 는 Gson관련하여 화면에 뿌릴 필드를 정하는 옵션입니다. jpa와는 무관합니다.
. MemberInter.class에서 많이 헷갈렸습니다. (@ManyToOne)
-- @JoinColumn을 추가로.. 써야 합니다.
-- optional을 true로 하면 join시 outer join을 합니다. (false는 inner join)
FetchType.EAGER -> 즉시 조회해서 데이타 채움
FetchType.LAZY -> 필요시 DB조회
##나중에 추가됨
- 필드명은 카멜케이스CamelCase를 꼭 써야 한다. 안그럼 나중에 method named query 시에 곤란해진다...
Member.java
@Entity @Table(name = "tb_member")
public class Member {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer member_seq;
@Expose
@OneToMany(
targetEntity = Image.class
, cascade = CascadeType.ALL
, fetch = FetchType.EAGER
, mappedBy = "member_seq")
private List<image> imageList;
@Expose
@OneToMany(
targetEntity = MemberInter.class
, cascade = CascadeType.ALL
, fetch = FetchType.EAGER
, mappedBy = "member_seq")
private List<memberinter> memberInterList;
}
MemberRepository.java
public interface MemberRepository extends JpaRepository<Member, Integer> {
}
Image.java
@Entity
@Table(name = "tb_image")
public class Image {
@Id
@GeneratedValue
private Integer image_seq;
@Column
private Integer member_seq;
@Column @Expose
private String file_name;
}
Inter.java
@Entity @Table(name="tb_inter") @Embeddable
public class Inter {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer inter_seq;
@Column @Expose
private String inter_name_ko;
}
MemberInter.java
@Entity @Table(name="tb_member_inter") @IdClass(MemberInterPk.class)
public class MemberInter {
@Id @Column
private Integer member_seq;
@Id @Column(insertable = false, updatable = false)
private Integer inter_seq;
@ManyToOne(
targetEntity = Inter.class
,cascade = CascadeType.ALL
,fetch = FetchType.EAGER
,optional = false
)
@JoinColumn(name = "inter_seq")
@Expose
private Inter inter;
}
MemberInterPk.java
public class MemberInterPk implements Serializable {
private Integer member_seq;
private Integer inter_seq;
}
test 코드...
TestServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"classpath:servlet-context.xml",
"classpath:config/context-datasource.xml"
})
public class TestServiceTest {
private static final Logger logger = LoggerFactory.getLogger(TestServiceTest.class);
@Autowired
private Gson gson;
@Autowired
private MemberRepository memberRepository;
@Test
public void testGetMemberList() throws Exception {
logger.info("------------ jpa test starting.... ------------------------");
List<member> list = memberRepository.findAll();
logger.info("memberList={}", gson.toJson(list));
logger.info("------------ jpa test ended.... ------------------------");
}
}
2015년 10월 5일 월요일
코드 꾸미기 툴 SyntaxHighlighter.js 에서 highlight.js 로 갈아 탐
템플릿> Html편집에 들어가서 아래 코드를 바로 위에 붙여 넣는다.
설치 및 사용법 https://highlightjs.org/
!사용법
... xml내용...
만약 html이나 xml의 < 등을 수동으로 하려면... class에 noxml을 넣으면 되요.
... xml내용...
spring jpa 설정 및 테스트 (maven 설정)
거의 대부분 mybatis 를 이용하여 개발을 하는데..
JPA가 대세라고 해서 가벼운 프로젝트에 연동을 해봤습니다.
1. 라이브러리 import....
maven pom.xml
2. Entity class를 만들어 줍니다.
참고로 SerializedName, Expose는 jpa와 직접 관련은 없습니다.. (개체를 그대로 JsonView 할때 사용)
3. repository 를 만들어줍니다. (아무것도 없는게.. 인상적)
4. context-jpa.xml 설정합니다. (txManager2인 이유는 기존에 mybatis에 영향을 주지 않기 위해서입니다. , mybatis를 한번에 다 걷어낼 자신이 없...)
5. 사용 예제
인터넷상에 자료가 많아서 설정은 어렵지 않았습니다.
하지만 실제로 사용에 요령이 필요하다고 하네요.. (제대로 이해를 하지 않고 사용하면 성능에도 영향을 준다고 함)
JPA가 대세라고 해서 가벼운 프로젝트에 연동을 해봤습니다.
1. 라이브러리 import....
maven pom.xml
org.springframework.data
spring-data-jpa
1.9.0.RELEASE
org.hibernate
hibernate-entitymanager
4.3.8.Final
2. Entity class를 만들어 줍니다.
참고로 SerializedName, Expose는 jpa와 직접 관련은 없습니다.. (개체를 그대로 JsonView 할때 사용)
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import javax.persistence.*;
@Entity
@Table(name="tb_notice")
public class Notice {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "notice_id")
@SerializedName(value = "notice_id")
@Expose
private Integer noticeId;
@Column(name="title", nullable = false)
@Expose
private String title;
@Column(name="content", nullable = false)
@Expose
private String content;
@Column(name="reg_date", nullable = false)
@SerializedName(value = "reg_date")
@Expose
private String regDate;
@Column(name="del_yn", nullable = false)
@Expose(serialize = false, deserialize = false)
private String delYn;
public Integer getNoticeId() {
return noticeId;
}
public void setNoticeId(Integer noticeId) {
this.noticeId = noticeId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
public String getDelYn() {
return delYn;
}
public void setDelYn(String delYn) {
this.delYn = delYn;
}
}
3. repository 를 만들어줍니다. (아무것도 없는게.. 인상적)
public interface NoticeRepository extends JpaRepository<Notice, Integer> {
}
4. context-jpa.xml 설정합니다. (txManager2인 이유는 기존에 mybatis에 영향을 주지 않기 위해서입니다. , mybatis를 한번에 다 걷어낼 자신이 없...)
5. 사용 예제
@Service
public class NoticeService extends ServiceBase {
private static final Logger logger = LoggerFactory.getLogger(NoticeService.class);
@Autowired
private NoticeRepository noticeRepository;
public void srXX(RequestData req, ResponseData res) throws Exception {
List<Notice> list = noticeRepository.findAll();
res.put("notice_list", list);
}
}
인터넷상에 자료가 많아서 설정은 어렵지 않았습니다.
하지만 실제로 사용에 요령이 필요하다고 하네요.. (제대로 이해를 하지 않고 사용하면 성능에도 영향을 준다고 함)
2015년 9월 20일 일요일
redis 3.0.4 설치
컴파일러를 먼저 설치해야 합니다. (설치돼 있다면 패스)
yum install gcc gcc-c++ autoconf automake
참고) http://www.redis.io/download
# 다운로드 및 설치 (컴파일)
wget http://download.redis.io/releases/redis-3.0.4.tar.gz
tar xzf redis-3.0.4.tar.gz
cd redis-3.0.4
make && make install
cd utils
./install_server.sh
# redis-6379로 서비스가 만들어져 있을껀데.. 사용하기 좋게 redis로 이름 바꿔줍니다.
mv /etc/init.d/redis-6379 /etc/init.d/redis
service redis start
# chkconfig redis on 하면 부팅시 자동 실행됩니다.
2015년 9월 16일 수요일
.NET Framework 4.5.2로 개발했다가. 4.0로... 내림
최근에 윈도우 어플을 개발할 일이 생겼다.
.NET 4.5부터 async 문법이 새로 들어갔다 해서.. 이왕 하는거 4.5.2로... 만들기로 했다.
오...... 엄청나게 편리하다.!!
async, await 두개가 중요하다.
특히 UI프로그램에서 background thread와 main thread와의 동기화를 쉽게 지원한다.
아래는 id/pwd를 입력받아서 서버통신으로 인증을 진행하는 코드다.
보면 알겠지만 client이벤트에서 바로 ... 별도 쓰레드 동기화 없이.. 로그인 처리를 모두 완료했다.
오늘 테스트를 진행하는데...
.NET Framework 4.5 깔린... PC가.. 많이 없네.....
... 그래서.. 4.0으로.. BackgroundWorker 사용해서 재개발했다...
그지 같네... (화면이 세개인 프로그램이라 다행)
.NET 4.5부터 async 문법이 새로 들어갔다 해서.. 이왕 하는거 4.5.2로... 만들기로 했다.
오...... 엄청나게 편리하다.!!
async, await 두개가 중요하다.
특히 UI프로그램에서 background thread와 main thread와의 동기화를 쉽게 지원한다.
아래는 id/pwd를 입력받아서 서버통신으로 인증을 진행하는 코드다.
private async void btnLogin_Click(object sender, RoutedEventArgs e)
{
string id = tbEmail.Text;
string pwd = tbPassword.Password;
SetControlEnableState(false);
bool isSuccess = await Task.Run<bool>(() =>
{
try
{
// 여기가 네트워크 통신을 하는 부분이다.
_dataCore.DoLogin(id, pwd);
return true;
}
catch (Exception x)
{
ErrorHandler.ErrorDump(x, true);
return false;
}
});
if (!isSuccess)
{
SetControlEnableState(true);
return;
}
}
보면 알겠지만 client이벤트에서 바로 ... 별도 쓰레드 동기화 없이.. 로그인 처리를 모두 완료했다.
오늘 테스트를 진행하는데...
.NET Framework 4.5 깔린... PC가.. 많이 없네.....
... 그래서.. 4.0으로.. BackgroundWorker 사용해서 재개발했다...
그지 같네... (화면이 세개인 프로그램이라 다행)
2015년 9월 15일 화요일
디지탈오션에 서버 셋팅기 (centos 6.7)
친구랑 개발하는 간단한 쪽지앱의 서버로 사용할 서버를 구축했다.
물론 나는 잘 모른다 모든건 다 구글을 통해..
1. SWAP 메모리 할당
참고) https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-centos-6
dd if=/dev/zero of=/swapfile bs=1024 count=2048k
mkswap /swapfile
swapon /swapfile
chown root:root /swapfile
chmod 0600 /swapfile
아래 내용을 /etc/fstab 에 붙인다.
/swapfile swap swap defaults 0 0
2. 서버 시간을 KST 로 바꿈 & rdate 설치
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
yum install rdate
3. java 1.7설치 rpm
http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html
위에서 64비트 linux용으로 다운받는다.
rpm -ivh jre-7u80-linux-x64.rpm
4. 위와 같은 방법으로 rabbitMQ 서버도 설치
rpm -ivh erlang-17.4-1.el6.x86_64.rpm
rpm -ivh rabbitmq-server-3.4.4-1.noarch.rpm
/etc/rabbitmq/rabbitmq-env.conf 파일 만들고 nodename 지정
NODENAME=samplenode
관리자 페이지 플러그인 활성화 & 서버 시작
rabbitmq-plugins enable rabbitmq_management
rabbitmq-server -detached
사용자 추가, id/pwd 지정하기 권한 주기
참고) https://www.rabbitmq.com/man/rabbitmqctl.1.man.html#
rabbitmqctl add_user {username} {password}
rabbitmqctl set_user_tags {username} administrator
http://hostname:15672/ 에 접속하여 admin메뉴에서 guest 계정 삭제
신규 worker 계정 추가
5. tomcat 7 설치
tar 다운로드 하여 /usr/local/ 에 압축을 풀고.
ln -s apache-tomcat-7.0.57 tomcat
6. mariadb 설치
http://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_MariaDB_%EC%84%A4%EC%B9%98 참고
아래 파일을 생성하고 내용을 작성
/etc/yum.repos.d/MariaDB.repoMariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum install MariaDB-server MariaDB-client
#나중에 추가됨 (기본 설정 파일 적용)
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
7. apache 설치
yum install httpd
yum install mod_ssl
8. iptables 설정
아래 좋은 글이 있어 참고하여 아래와 같이 작성 했다.
출처) http://webdir.tistory.com/170
#!/bin/bash
# iptables 설정 자동화 스크립트
# 입맛에 따라 수정해서 사용합시다.
iptables -F
# TCP 포트 22번을 SSH 접속을 위해 허용
# 원격 접속을 위해 먼저 설정합니다
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 기본 정책을 설정합니다
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# localhost 접속 허용
iptables -A INPUT -i lo -j ACCEPT
# established and related 접속을 허용
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 기타 사용하는 포트 허용
# -s sourceIP 를 추가 하여 특정 아이피만 가능하도록 할 수 있다.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 15672 -j ACCEPT
# 설정을 저장
/sbin/service iptables save
# 설정한 내용을 출력
iptables -L -v
2015년 8월 27일 목요일
spring batch 사용
최근에 spring-batch를 사용해 봤는데.. 결과는 성공적 특히 트랜잭션commit size와 read size를 따로 지정할 수 있다는게 좋은것 같다.
쿼리나 기타 로직보다 아래 설정이 중요한 듯 하여 아래 설정을 기록으로 남긴다.
job에 대해서 요약하면
# reader에서 데이타를 읽어서 process 에서 처리 하고 writer로 결과를 기록 한다.
물론 위 설정 외에 각 시작 구간마다 이벤트를 받아 처리 할 수 있는 listener 같은 것도 제공한다.
reader, writer는 커스텀 하지 않고 mybatis에서 기본으로 제공하는 걸 이용했다.
참고) https://mybatis.github.io/spring/ko/batch.html
쿼리나 기타 로직보다 아래 설정이 중요한 듯 하여 아래 설정을 기록으로 남긴다.
job에 대해서 요약하면
# reader에서 데이타를 읽어서 process 에서 처리 하고 writer로 결과를 기록 한다.
물론 위 설정 외에 각 시작 구간마다 이벤트를 받아 처리 할 수 있는 listener 같은 것도 제공한다.
reader, writer는 커스텀 하지 않고 mybatis에서 기본으로 제공하는 걸 이용했다.
참고) https://mybatis.github.io/spring/ko/batch.html
2015년 7월 1일 수요일
jfreeChart 에서 한글 깨질때 centos 폰트 설정
jfreeChart를 사용하는 중인데 tomcat위에서 돌리면 한글이 ㅁㅁㅁ 과 같이 나온다.
아래와 같이 한글 폰트를 os에 설치 한다. (물론 코드에서는 폰트 명을 지정해야 한다.)
반영을 위하여 꼭 tomcat을 재시작 해야 한다.
아래와 같이 한글 폰트를 os에 설치 한다. (물론 코드에서는 폰트 명을 지정해야 한다.)
yum install -y kde-i18n-Korean
yum install -y fonts-korean
fc-cache -fv
반영을 위하여 꼭 tomcat을 재시작 해야 한다.
2015년 6월 4일 목요일
OSX 10.10.3 homebrew 설치하기
터미널 열고
출처: http://coolestguidesontheplanet.com/installing-homebrew-os-x-yosemite-10-10-package-manager-unix-apps/
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
gimjonghuiui-MacBook-Pro:bin paper$ brew -v
Homebrew 0.9.5
출처: http://coolestguidesontheplanet.com/installing-homebrew-os-x-yosemite-10-10-package-manager-unix-apps/
2015년 4월 15일 수요일
하둡 스프링 연동 테스트2 - hadoop 2.6.x with spring 4.0 (MapReduce WordCount example)
context-hadoop.xml에 아래 내용 추가.
WordCount.java
1. Before를 통하여 로컬에 있는 debug.log 파일을 hdfs에 카피 해놓는다.
2. Job을 실행한다.
3. 실행하면 debug.log 파일을 line단위로 읽어들이는걸 확인 할 수 있다. (WordCount$TokenizerMapper)
fs.default.name=hdfs://localhost:9000
WordCount.java
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.StringTokenizer;
public class WordCount {
private static final Logger logger = LoggerFactory.getLogger(WordCount.class);
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
@Override
public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
logger.info("map key={}, value={}", key, value);
StringTokenizer itr = new StringTokenizer(value.toString());
while (itr.hasMoreTokens()) {
word.set(itr.nextToken());
context.write(word, one);
}
}
}
public static class IntSumReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
@Override
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
logger.info("reduce key={}", key);
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
result.set(sum);
context.write(key, result);
}
}
}
Test.java
@Autowired
private org.apache.hadoop.conf.Configuration hdConf;
@Autowired
private JobRunner wordCountJobRunner;
@Before
public void beforeCopyFile() throws IOException {
String file = "/Users/paper/Desktop/4/14/debug.2015-04-09.log";
Path srcFilePath = new Path(file);
Path dstFilePath = new Path("/input/debug.2015-04-09.log");
FileSystem hdfs = FileSystem.get(dstFilePath.toUri(), hdConf);
hdfs.copyFromLocalFile(false, true, srcFilePath, dstFilePath);
hdfs.delete(new Path("/output/"), true);
}
@Test
public void testRunJob() throws Exception {
wordCountJobRunner.call();
}
1. Before를 통하여 로컬에 있는 debug.log 파일을 hdfs에 카피 해놓는다.
2. Job을 실행한다.
3. 실행하면 debug.log 파일을 line단위로 읽어들이는걸 확인 할 수 있다. (WordCount$TokenizerMapper)
2015년 4월 12일 일요일
하둡 스프링 연동 테스트 - hadoop 2.6.x with spring 4.0
Hadoop 설치 및 설정은 아래와 같이 (osx 요세미티.)
https://hadoop.apache.org/releases.html#Download ( 2.6.x 버전 )
설치는 아래 블로그 보고 함
http://iamhereweare.blogspot.kr/2014/05/hadoop.html
- pom.xml 에 아래 dependency 추가.
- context-hadoop.xml spring 설정에 파일 추가
아래와 같이 test코드 작성.
- HdTestServiceTest.java
잘된다. 다만 아직 로컬에서 못벗어 났지만.. 벗어날 서버가 없어..
위 코드를 이용하면 파일 업로드 다운로드까지는 구현이 가능하겠다.
https://hadoop.apache.org/releases.html#Download ( 2.6.x 버전 )
설치는 아래 블로그 보고 함
http://iamhereweare.blogspot.kr/2014/05/hadoop.html
- pom.xml 에 아래 dependency 추가.
org.springframework.data
spring-data-hadoop
2.1.1.RELEASE
- context-hadoop.xml spring 설정에 파일 추가
fs.default.name=hdfs://localhost:9000
아래와 같이 test코드 작성.
- HdTestServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"classpath:servlet-context.xml",
"classpath:config/context-datasource.xml",
"classpath:config/context-hadoop.xml"
})
public class HdTestServiceTest {
private static final Logger logger = LoggerFactory.getLogger(HdTestService.class);
@Autowired
private org.apache.hadoop.conf.Configuration hdConf;
@Test
public void testDoTest() throws Exception {
FileSystem hdfs = null;
try {
Path filePath = new Path("/tmp/test.txt");
logger.info("filePath.uri={}", filePath.toUri());
hdfs = FileSystem.get(filePath.toUri(), hdConf);
if(hdfs.exists(filePath)) {
logger.info("read file path={}", filePath);
BufferedReader r = new BufferedReader(new InputStreamReader(hdfs.open(filePath), "utf-8"));
String line = null;
do {
line = r.readLine();
logger.info(" line={}", line);
}
while(line != null);
r.close();
// dfs.delete(filePath, true);
} else {
logger.info("create new file path={}", filePath);
FSDataOutputStream out = hdfs.create(filePath, false);
out.write("한글 생성 테스트".getBytes("utf-8"));
out.flush();
out.close();
}
}
finally {
IOUtils.closeQuietly(hdfs);
}
}
}
잘된다. 다만 아직 로컬에서 못벗어 났지만.. 벗어날 서버가 없어..
위 코드를 이용하면 파일 업로드 다운로드까지는 구현이 가능하겠다.
2015년 3월 27일 금요일
2015년 3월 24일 화요일
spring junit testcase 작성
maven에 아래 추가.
test java코드 MemberServiceTest.java
이때 디비를 jndi-lookup 를 이용하는 경우를 위해 test/resources/config/context-datasource.xml 을 넣어서 아래와 같이 기존 id를 덮었다.
test/resources/config/context-datasource.xml 파일
org.springframework
spring-test
4.0.5.RELEASE
test
test java코드 MemberServiceTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( {
"classpath:servlet-context.xml",
"classpath:config/context-datasource.xml"
}
)
public class MemberServiceTest {
@Autowired
MemberService memberService;
@Test
public void testSr2002() throws Exception {
RequestData req = new RequestData(null, new DbMap());
ResponseData res = new ResponseData(new DbMap());
memberService.sr2002(req, res);
}
}
이때 디비를 jndi-lookup 를 이용하는 경우를 위해 test/resources/config/context-datasource.xml 을 넣어서 아래와 같이 기존 id를 덮었다.
test/resources/config/context-datasource.xml 파일
2015년 3월 10일 화요일
spring-rabbitmq 연동
설치는 그냥 rpm 으로 설치
--- spring-rabbit 연동 pom.xml
context-rabbitmq.xml
MqService.java
# 서버 시작.
sbin/rabbitmq-server start
# 서버 중지
sbin/rabbitmqctl stop
--- spring-rabbit 연동 pom.xml
org.springframework.amqp
spring-rabbit
1.4.1.RELEASE
context-rabbitmq.xml
MqService.java
@Service
public class MqService implements MessageListener {
private static final Logger logger = LoggerFactory.getLogger(MqService.class);
private static final String TASK_QUEUE_NAME = "simple_queue";
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(String message) throws IOException {
rabbitTemplate.convertAndSend(TASK_QUEUE_NAME, message);
logger.info("send message={}", message);
}
@Override
public void onMessage(Message message) {
String msg = null;
try {
msg = new String(message.getBody(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
logger.info("recv message=" + msg );
}
}
2015년 3월 4일 수요일
git 관련 명령어 모음
// svn to git 마이그레이션
$ git svn clone --stdlayout --no-metadata -A users.txt svn://example.com/repository/projectname
$ cd projectname
// 아래 users.txt 만드는건데 perl 이 없어서 그런지.. 안되네요... ㅠ
//$ svn log ^/ --xml | grep -P "^<author" | sort -u | \ perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt
// ignore file처리
$ git svn show-ignore -i trunk > .gitignore
// remote git 지정
$ git remote add origin git@git.example.com:group/projectname.git
// tags 처리
$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
// branches 처리
$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done
// push한다.
$ git push origin --all
$ git push origin --tags
// revert local commit
git reset —hard remotes/origin/HEAD
-----------
// backup
$ sudo gitlab-rake gitlab:backup:create
// restore (가장 최근꺼 복원)
$ sudo gitlab-rake gitlab:backup:restore
// restore OPTION (아래 지정한 타임스탬프로 복원시켜준다는건가.. 안해봄..)
BACKUP=timestamp_of_backup (required if more than one backup exists)
2015년 2월 10일 화요일
mysql, mariadb에서 유니코드(utf8mb4) 지원하기
1. 현재 설정된 상태 확인
2. sudo vi /etc/my.cnf 파일을 아래 부분 수정
3. 서비스 재시작
4. 확인
마지막으로 실제 적용할 컬럼의 타입을 바꿔야 한다.
utf8mb4로 바꿔야 합니다.
MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+---------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/|
+--------------------------+---------------------------------+
2. sudo vi /etc/my.cnf 파일을 아래 부분 수정
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
3. 서비스 재시작
service mysql restart
4. 확인
MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
마지막으로 실제 적용할 컬럼의 타입을 바꿔야 한다.
utf8mb4로 바꿔야 합니다.
2015년 2월 5일 목요일
CentOS 명령어 모음
#프로그램 설치위치 찾기
paper$ which java
/usr/bin/java
#오래된 로그파일만 찾아서 삭제함
find /logs/httpd/ -type f -mtime +180 -exec rm -f {} \;
#hosts 편집
vi /etc/hosts
#dns서버 수정
vi /etc/resolv.conf
#OS 비트 확인
getconf LONG_BIT
#OS 버전 확인
$ cat /etc/issue
#폰트목록
$ fc-list
#폰트 반영 (/usr/share/fonts 에 폰트 넣고)
$ fc-cache -fv
spring map to xml viewresolver
항상 json으로만 뱉다가 xml로 뱉어야 하는 상황이 발생해서 만든 spring view 클래스
결과가 map에 경우에만 해당됨
아래 설정하고...
xml-views.xml 내용.
text/xml;charset=utf-8
아래 클래스를 이용함
public class AjaxResponseXMLView extends AbstractView {
@Override
protected void renderMergedOutputModel(Map map, HttpServletRequest request,
HttpServletResponse response) throws Exception {
String xmlHeader = "\r\n";
StringBuffer xmlSb = new StringBuffer();
xmlSb.append(xmlHeader);
xmlSb.append("");
writeFromMap(xmlSb, map);
xmlSb.append("");
response.setContentType("application/xml");
response.setCharacterEncoding("utf-8");
response.setHeader("Cache-Control", "no-cache");
response.setContentLength(xmlSb.toString().getBytes("utf-8").length);
response.getWriter().print(xmlSb.toString());
}
private void writeFromMap(StringBuffer sb, Map map) {
for(Object str : map.keySet()) {
Object v = map.get(str);
sb.append("<" + str + ">");
if(v instanceof Map) {
writeFromMap(sb, (Map) v);
}
else if(v instanceof List) {
writeFromList(sb, (List) v);
}
else {
writeFromData(sb, v);
}
sb.append("" + str + ">");
}
}
private void writeFromList(StringBuffer sb, List list) {
for(Object v : list) {
sb.append("");
if(v instanceof Map) {
writeFromMap(sb, (Map)v);
}
else if(v instanceof List) {
writeFromList(sb, (List) v);
}
else {
writeFromData(sb, v);
}
sb.append("");
}
}
private void writeFromData(StringBuffer sb, Object data) {
sb.append(escapeXml(data+""));
}
private String escapeXml(String src) {
// " "
// < <
// > >
// & &
src = src.replace("\"", """);
src = src.replace("<", "<");
src = src.replace(">", ">");
src = src.replace("&", "&");
return src;
}
}
tomcat 에서 OutOfMemory 자주 나오면.
// catalina.sh 맨 상위에 아래를 추가해서 메모리를 크게 잡자.
export CATALINA_OPTS="-Djava.awt.headless=true -server -Xms2048m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=512m"
피드 구독하기:
글 (Atom)