안녕하세요?
이전에는 XML-RPC를 사용한 네이버 블로그 API 글 등록을 해봤었습니다. 이번에는 Open API를 사용하여 티스토리에 글쓰기를 해보겠습니다.
티스토리는 주요기능이 포함된 OAuth2.0 기반 Open API를 제공합니다. 보안 프로토콜과 함께 REST방식을 지원하며 이기능을 사용하여 티스토리에 글쓰기를 하는 과정을 담았습니다. 예전에 티스토리도 XML-RPC방식으로 글쓰기가 가능한것 같습니다만 현재는 지원을 안하는것 같으며 글등록 개수도 제한이 되어 현 가입한 사용자는 하루 글등록 개수가 15개이며 예전 사용자는 글을 더 등록할수 있는것 같습니다.
2020-03-02
2020-02-16
쿠팡파트너스 API를 사용하여 상품정보 가져오기
안녕하세요?
몇달전부터 쿠팡파트너스를 이용한 제휴마케팅 또는 어필리에이트에 대해 인터넷에서 활봘한 활동이 이루어지고 커뮤니티 공간도 많이 생긴것 같습니다. 저도 이부분에 대해 관심있는 사람들중 한명입니다. 그래서 쿠팡파트너스에 대해 알아보고 제공하는 API를 통한 상품정보를 가져오는 테스트를 해볼려고 합니다.
몇달전부터 쿠팡파트너스를 이용한 제휴마케팅 또는 어필리에이트에 대해 인터넷에서 활봘한 활동이 이루어지고 커뮤니티 공간도 많이 생긴것 같습니다. 저도 이부분에 대해 관심있는 사람들중 한명입니다. 그래서 쿠팡파트너스에 대해 알아보고 제공하는 API를 통한 상품정보를 가져오는 테스트를 해볼려고 합니다.
쿠팡파트너스에 대해서는 이전에 포스팅했던 '쿠팡파트너스 활용방법'에 대한글을 봐주셨으면 좋겠습니다. 어필리에이트는 구매전환이 이루어지는 상품링크를 자신이 운영하는 사이트에 광고를 하여 수익을 발생시키는 매체사를 뜻하며 제휴마케팅(Affliate marketing)은 상품 판매/광고 기법으로 어필리에이트에 머천트(Merchant) 광고주가 제공하는 상품을 구매전환을 발생시켜 수익을 얻는 것입니다. - 위키백과 참조
2020-02-12
XML-RPC를 사용한 네이버 블로그 API 글등록
안녕하세요?
이글은 XML-RPC기술을 이용한 JAVA 프로그램을 구현하여 네이버 블로그에 글을 등록하는 과정을 설명합니다. 일단 XML-RPC라는 기술부터 간단하게 알아보겠습니다.
■ XML-RPC란?
XML기반의 HTTP를 통한 간단하고 이식성 높은 원격 프로시저(Remote Procedure Call) 호출 방법이며 지원하는 언어가 JAVA외에 Perl, Python, C, C++, PHP 등 이며 운영체제는 Unix, Windows 등 가능합니다.
이와 비슷한 기술인 SOAP, JSON-RPC가 존재합니다. - 출처: 위키백과
이글은 XML-RPC기술을 이용한 JAVA 프로그램을 구현하여 네이버 블로그에 글을 등록하는 과정을 설명합니다. 일단 XML-RPC라는 기술부터 간단하게 알아보겠습니다.
■ XML-RPC란?
XML기반의 HTTP를 통한 간단하고 이식성 높은 원격 프로시저(Remote Procedure Call) 호출 방법이며 지원하는 언어가 JAVA외에 Perl, Python, C, C++, PHP 등 이며 운영체제는 Unix, Windows 등 가능합니다.
이와 비슷한 기술인 SOAP, JSON-RPC가 존재합니다. - 출처: 위키백과
2019-11-08
[Interface] JCO(SAP Java Connector)
JCO는 JCO관련 라이브러리를 사용한 외부프로그램에서 SAP의 RFC(Remote Function Call))를 위한 것이며 SAP와 데이터를 주고받기 위한 기술들 중 하나이다.
Example소스:
https://github.com/bangtae/com.bangtae/blob/master/com.bang/src/main/java/com/bang/example/service/ExampleService.java
Example소스:
https://github.com/bangtae/com.bangtae/blob/master/com.bang/src/main/java/com/bang/example/service/ExampleService.java
소스설명
ABAP_AS, ABAP_MS라는 SAP접속하기 위한 정보를 입력하는 부분이 있는데 이 정보에 따라 SAP 개발,품질 그리고 운영에 접근방법이 달라진다.
예전에 프로젝트 했을때 SAP 개발, 품질의 RFC는 잘 호출되었었는데 운영에서 호출이 안되는 경우 있었다.
SAP에서 제공하는 라이브러리인 sapjco3.jar를 사용한 예제가 있고 sapjco3.jar와 pom.xml에 등록된 jco라이브러리를 사용한 예제가 있다.
ABAP_AS, ABAP_MS라는 SAP접속하기 위한 정보를 입력하는 부분이 있는데 이 정보에 따라 SAP 개발,품질 그리고 운영에 접근방법이 달라진다.
예전에 프로젝트 했을때 SAP 개발, 품질의 RFC는 잘 호출되었었는데 운영에서 호출이 안되는 경우 있었다.
SAP에서 제공하는 라이브러리인 sapjco3.jar를 사용한 예제가 있고 sapjco3.jar와 pom.xml에 등록된 jco라이브러리를 사용한 예제가 있다.
준비
1. Client의 호출하는 소스에는 SAP 접속정보가 셋팅이 되어있어야 한다.
2. Server(SAP)의 RFC의 Processing Type상태는 'Remote-Enabled Module'로 설정되어있어야 한다.
3. 로컬환경이라 다를수 있지만 윈도우환경에 톰켓인 경우 톰켓의 lib 디렉토리에 sapjco3.jar, sapjco3.dll를 넣고 테스트를 했을때는 문제없이 호출이 잘되는것 같다.
1. Client의 호출하는 소스에는 SAP 접속정보가 셋팅이 되어있어야 한다.
2. Server(SAP)의 RFC의 Processing Type상태는 'Remote-Enabled Module'로 설정되어있어야 한다.
3. 로컬환경이라 다를수 있지만 윈도우환경에 톰켓인 경우 톰켓의 lib 디렉토리에 sapjco3.jar, sapjco3.dll를 넣고 테스트를 했을때는 문제없이 호출이 잘되는것 같다.
2019-07-17
[Spring] Spring Batch
참고 사이트: https://jojoldu.tistory.com/325
스프링 MVC 라이브러리가 존재하는 pom.xml에 스프링배치 라이브러리 등록 시 충돌이 생기는것 같다. 필자 생각으로는 스프링 배치를 별개의 프로젝트로 만들어 .jar로 생성하여 사용하는 방법이 괜찮을 것 같다.
스프링 배치는 셋팅이나 배치관련 테이블을 생성해야하는데 복잡한 배치로직 아니면 스케쥴러로 사용하는게 괜찮을것 같다.
Troubleshooting
1. MySql 배치관련 테이블 생성 후 수행 시 Not found DataAccessUtils.nullableSingleResult 관련 에러가 발생되는데 Spring Boot 버젼 변경 후 해결되었다(2.0.4 -> 2.1.4)
* H2DB에서는 배치관련 테이블 생성 후 배치 수행 시 데이터가 Insert가 되지 않는다.
2. application의 .yml파일 설정 시 Initializing lazy target object로그 확인이 되지만 실질적으로 수행이 안되는데 .properties은 정상 작동한다.
스프링 MVC 라이브러리가 존재하는 pom.xml에 스프링배치 라이브러리 등록 시 충돌이 생기는것 같다. 필자 생각으로는 스프링 배치를 별개의 프로젝트로 만들어 .jar로 생성하여 사용하는 방법이 괜찮을 것 같다.
스프링 배치는 셋팅이나 배치관련 테이블을 생성해야하는데 복잡한 배치로직 아니면 스케쥴러로 사용하는게 괜찮을것 같다.
Troubleshooting
1. MySql 배치관련 테이블 생성 후 수행 시 Not found DataAccessUtils.nullableSingleResult 관련 에러가 발생되는데 Spring Boot 버젼 변경 후 해결되었다(2.0.4 -> 2.1.4)
* H2DB에서는 배치관련 테이블 생성 후 배치 수행 시 데이터가 Insert가 되지 않는다.
2. application의 .yml파일 설정 시 Initializing lazy target object로그 확인이 되지만 실질적으로 수행이 안되는데 .properties은 정상 작동한다.
2019-05-10
Development Memo
무한 스크롤 vs 페이지네이션 vs '더보기' 버튼
HttpClient Basic Authenticatio
[jQuery]원하는 위치에 TR추가하기
jquery 빠르게 테이블(table) 로딩하기
난독화가 적용되었는지 확인/[Android]
안드로이드 이클립스에서 Proguard(프로가드) 사용하기
[ SPRING ] CXF 를 이용한 WebService 구현 1
java byte 단위길이로 문자열 자르기
https://kangtu.tistory.com/m/19
깨진데이터 포함된 데이터를 Length체크시 40자리로 나오지만 오라클 Insert시 41자리로 들어가 사이즈 오버 에러 발생 결국 이 소스로 해결
깨진데이터 포함된 데이터를 Length체크시 40자리로 나오지만 오라클 Insert시 41자리로 들어가 사이즈 오버 에러 발생 결국 이 소스로 해결
How to post form data using Jesrey?
https://stackoverflow.com/questions/27539681/how-to-post-form-data-using-jesrey
HTTP POST방식으로 Content-Type을 application/x-www-form-urlencoded로 보낸 데이터를 REST로 수신받는방법
HTTP POST방식으로 Content-Type을 application/x-www-form-urlencoded로 보낸 데이터를 REST로 수신받는방법
Java Code Examples for org.apache.http.client.methods.HttpPut
자바스크립트 정렬(Javascript Sort)
자바스크립트 정렬 함수, sort()
개발 툴 설치 필요없이 웹화면에서 선택한 개발언어로 간단하게 코딩과 테스트가 가능하다.
개발 노하우..
30년차 개발자 장동수가 말하는 좋은 개발자
PreparedStatement 객체 재사용하기
ftp4j
FTP관련 라이브러리인 apache의 commons-net과 다른 라이브러리이다.
TIOBE Index
Java BeanUtils - Background (DynaBeans)
변수명 짓기
[성능테스트] Apache - JMeter 사용법
Netcat을 이용하여 방화벽 아웃 바운드 정책 확인하기
Verbose Garbage Collection in Java
자바 메모리 관리 - 가비지 컬렉션
[Java] 이클립스 디컴파일 Jadclipse 설치
Java Locks and Atomic Variables Tutorial
AtomicReference
멜드(Meld)를 이용한 파일 비교 : 스마일서브 공식 블로그 [ IDC HOWTO ]
메이븐 저장소
이전 JDK 다운로드
Javascript StringBuilder .. 메모리 관리 합시다..
튜토리얼
xpath 테스터
2018-05-16
[DesignPattern]Enum Factory Method Pattern
Factory Method Pattern에 Enum을 사용하여 개선된 부분에 대해 주관적인 내용을 담고있습니다.
Enum은 싱글톤의 특성을 암묵적으로 갖고 있다. Factory Method Pattern만 사용하는 경우 같은 용도의 클래스를 중복생성 하여 사용하게 된다.
public interface 팩토리
public 냉면 냉면을만들다(String 냉면주문);
public class 물냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
public class 비빔냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
//B회사의 공장은 물냉면 공장과 비빔냉면 공장이 있다. 경기악화로 인하여 두 공장 중 한 공장을 패쇄해야하는 상황 발생되었다.
public class 냉면팩토리 implements 팩토리
물냉{
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
},
비냉{
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
};
//한 공장을 패쇄하기보다 둘다 운영하기 위해 ENUM을 도입하였다.
How to use(사용방법)
팩토리 팩토리 = 냉면팩토리.물냉;
냉면 냉면 = 팩토리.냉면을만들다(진주냉면);
//진주 비빔냉면을 주문받아 배달한다.
"보통 냉면을 구분할 때 물냉면이냐 비빔냉면이냐, 평양냉면이냐 함흥냉면이냐로 나눈다. 하지만, 진정한 냉면 마니아들에게는 또 다른 구분법이 있다. 바로 평양냉면이냐 해주냉면이냐다.
바로 평양냉면이냐 해주냉면이나다.
함흥냉면과는 다르게 해주냉면 또한 기본적으로 물냉면이다."
백헌석 / 최혜림 공저, 냉면열전 : 담백하고 시원한 한국인의 소울푸드
Reference(참조)
http://effectiveprogramming.tistory.com/m/entry/Enum-Abstract-Factory-패턴?category=660013
https://books.google.co.kr/books?id=cRkeCgAAQBAJ&pg=PT184&lpg=PT184&dq=물냉면+비빔냉면+언제+구분&source=bl&ots=b_hR2gCkcB&sig=7-H2TXK4soO6xjyxyuu4P8kyjtM&hl=ko&sa=X&ved=0ahUKEwjx596vu4nbAhXIybwKHY5LB9kQ6AEIhQEwDA#v=onepage&q=물냉면%20비빔냉면%20언제%20구분&f=false
Enum은 싱글톤의 특성을 암묵적으로 갖고 있다. Factory Method Pattern만 사용하는 경우 같은 용도의 클래스를 중복생성 하여 사용하게 된다.
public interface 팩토리
public 냉면 냉면을만들다(String 냉면주문);
public class 물냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
public class 비빔냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
//B회사의 공장은 물냉면 공장과 비빔냉면 공장이 있다. 경기악화로 인하여 두 공장 중 한 공장을 패쇄해야하는 상황 발생되었다.
public class 냉면팩토리 implements 팩토리
물냉{
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
},
비냉{
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
};
//한 공장을 패쇄하기보다 둘다 운영하기 위해 ENUM을 도입하였다.
How to use(사용방법)
팩토리 팩토리 = 냉면팩토리.물냉;
냉면 냉면 = 팩토리.냉면을만들다(진주냉면);
//진주 비빔냉면을 주문받아 배달한다.
"보통 냉면을 구분할 때 물냉면이냐 비빔냉면이냐, 평양냉면이냐 함흥냉면이냐로 나눈다. 하지만, 진정한 냉면 마니아들에게는 또 다른 구분법이 있다. 바로 평양냉면이냐 해주냉면이냐다.
바로 평양냉면이냐 해주냉면이나다.
함흥냉면과는 다르게 해주냉면 또한 기본적으로 물냉면이다."
백헌석 / 최혜림 공저, 냉면열전 : 담백하고 시원한 한국인의 소울푸드
Reference(참조)
http://effectiveprogramming.tistory.com/m/entry/Enum-Abstract-Factory-패턴?category=660013
https://books.google.co.kr/books?id=cRkeCgAAQBAJ&pg=PT184&lpg=PT184&dq=물냉면+비빔냉면+언제+구분&source=bl&ots=b_hR2gCkcB&sig=7-H2TXK4soO6xjyxyuu4P8kyjtM&hl=ko&sa=X&ved=0ahUKEwjx596vu4nbAhXIybwKHY5LB9kQ6AEIhQEwDA#v=onepage&q=물냉면%20비빔냉면%20언제%20구분&f=false
2018-05-14
[DesignPattern]Singleton Pattern
자바의 싱글톤의 주관적인 생각을 담은 내용입니다.
싱글톤 패턴은 웹어플리케이션 과정을 입문하면서 처음으로 알게된 자바 디자인 패턴이다. 그때 당시에는 DB커넥션할때 일일히 DB커넥션 객체를 인스턴스 할 필요 없이 싱글턴의 getInstance 메서드를 호출해서 하나의 객체를 전역으로 사용하는 부분이 편리했었다. 이 부분 외에 싱글톤의 효율적인 메모리 할당에 대해서는 몰랐던것 같다.
싱글톤의 이점으로 고정된 메모리를 할당하여 부분별하게 사용되는 메모리 낭비를 줄일수 있는것 같다.
멀티쓰레드나 분산처리 환경의 싱글톤은 자바의 객체지향설계원칙중 개방패쇄원칙에 위배나 데이터 동기화 문제가 발생될수도 있어 이런부분에 대해 보완이 필요할것 같다.
개방패쇄원칙은 JDBC를 예를 들어 설명할수 있을것 같다. 자바 프로그램에서 JDBC를 통해 Oracle이나 MS-SQL에 접근이 가능하다. 접근하는 DB가 MY-SQL, DB2가 추가된다고 해도 자바 프로그램에 영향이 없다.
싱글톤과 자바의 개방패쇄원칙을 적용한 디자인 패턴에는 ENUM을 사용한 팩토리 메소드 패턴이 있으며 싱글톤만 사용하는 경우는 남용하기보다 목적에 맞게 적당히 사용하는게 좋을것 같다.
Reference(참조)
http://server-engineer.tistory.com/225
http://limkydev.tistory.com/m/37?category=957882
http://effectiveprogramming.tistory.com/m/entry/Singleton-패턴?category=660013
싱글톤 패턴은 웹어플리케이션 과정을 입문하면서 처음으로 알게된 자바 디자인 패턴이다. 그때 당시에는 DB커넥션할때 일일히 DB커넥션 객체를 인스턴스 할 필요 없이 싱글턴의 getInstance 메서드를 호출해서 하나의 객체를 전역으로 사용하는 부분이 편리했었다. 이 부분 외에 싱글톤의 효율적인 메모리 할당에 대해서는 몰랐던것 같다.
싱글톤의 이점으로 고정된 메모리를 할당하여 부분별하게 사용되는 메모리 낭비를 줄일수 있는것 같다.
멀티쓰레드나 분산처리 환경의 싱글톤은 자바의 객체지향설계원칙중 개방패쇄원칙에 위배나 데이터 동기화 문제가 발생될수도 있어 이런부분에 대해 보완이 필요할것 같다.
개방패쇄원칙은 JDBC를 예를 들어 설명할수 있을것 같다. 자바 프로그램에서 JDBC를 통해 Oracle이나 MS-SQL에 접근이 가능하다. 접근하는 DB가 MY-SQL, DB2가 추가된다고 해도 자바 프로그램에 영향이 없다.
싱글톤과 자바의 개방패쇄원칙을 적용한 디자인 패턴에는 ENUM을 사용한 팩토리 메소드 패턴이 있으며 싱글톤만 사용하는 경우는 남용하기보다 목적에 맞게 적당히 사용하는게 좋을것 같다.
Reference(참조)
http://server-engineer.tistory.com/225
http://limkydev.tistory.com/m/37?category=957882
http://effectiveprogramming.tistory.com/m/entry/Singleton-패턴?category=660013
2018-05-11
[DesignPattern]Factory Method Pattern
자바의 여러 디자인패턴중 팩토리 메서드 패턴의 주관적인 생각을 설명한다.
public interface 팩토리
public 냉면 냉면을만들다(String 냉면주문);
//다양한 냉면의 주문을 한 곳에서 받아 공통적으로 만든다.
public class 냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
//메뉴판에 냉면메뉴 추가하기 용이하다.
//주문자가 냉면을 받기전까지 어떠 냉면인지 알수 없다.
public interface 냉면
public String 냉면배달();
public class 평양냉면 implements 냉면
@Override
public String 냉면배달(){
평양냉면을 배달한다.
}
//평양냉면을 배달하는데 어떤방식으로 배달할지 정하기 용이하다.
public class 진주냉면 implements 냉면
@Override
public String 냉면배달(){
진주냉면을 배달한다.
}
//진주냉면을 배달하는데 어떤방식으로 배달할지 정하기 용이하다.
평양냉면은 전분이 아니라 메밀가루가 많이 함유된 면으로 만든 냉면이며, 맑은국물에 밍밍한 맛이라고 한다. 필자도 못먹어봐서 표현을 잘 못하겠다.
진주냉면은 메밀면으로 만든 냉면으로 고명이 푸짐하다 고명에는 육전, 계란지단이 있고 육수는 해물육수라고 한다. 수원의 어느 진주냉면집에서 먹어봤는데 맑은육수에 담긴 진주냉면은 밍밍한 맛이라 양념이 들어간 냉면을 먹었었다. 육전과 면을 함께 먹어보니 너무 좋았다.
How to use(사용방법)
팩토리 팩토리 = new 냉면팩토리();
팩토리.냉면을만들다(평양냉면);
Reference(참조)
http://limkydev.tistory.com/m/83
http://effectiveprogramming.tistory.com/m/entry/Factory-Method-패턴-1?category=660013
https://m.blog.naver.com/PostView.nhn?blogId=bluey3555&logNo=220370748207&proxyReferer=&proxyReferer=
public interface 팩토리
public 냉면 냉면을만들다(String 냉면주문);
//다양한 냉면의 주문을 한 곳에서 받아 공통적으로 만든다.
public class 냉면팩토리 implements 팩토리
public 냉면 냉면을만들다(String 냉면주문){
냉면주문을 받아 해당하는 냉면을 만든다.
}
//메뉴판에 냉면메뉴 추가하기 용이하다.
//주문자가 냉면을 받기전까지 어떠 냉면인지 알수 없다.
public interface 냉면
public String 냉면배달();
public class 평양냉면 implements 냉면
@Override
public String 냉면배달(){
평양냉면을 배달한다.
}
//평양냉면을 배달하는데 어떤방식으로 배달할지 정하기 용이하다.
public class 진주냉면 implements 냉면
@Override
public String 냉면배달(){
진주냉면을 배달한다.
}
//진주냉면을 배달하는데 어떤방식으로 배달할지 정하기 용이하다.
평양냉면은 전분이 아니라 메밀가루가 많이 함유된 면으로 만든 냉면이며, 맑은국물에 밍밍한 맛이라고 한다. 필자도 못먹어봐서 표현을 잘 못하겠다.
진주냉면은 메밀면으로 만든 냉면으로 고명이 푸짐하다 고명에는 육전, 계란지단이 있고 육수는 해물육수라고 한다. 수원의 어느 진주냉면집에서 먹어봤는데 맑은육수에 담긴 진주냉면은 밍밍한 맛이라 양념이 들어간 냉면을 먹었었다. 육전과 면을 함께 먹어보니 너무 좋았다.
How to use(사용방법)
팩토리 팩토리 = new 냉면팩토리();
팩토리.냉면을만들다(평양냉면);
Reference(참조)
http://limkydev.tistory.com/m/83
http://effectiveprogramming.tistory.com/m/entry/Factory-Method-패턴-1?category=660013
https://m.blog.naver.com/PostView.nhn?blogId=bluey3555&logNo=220370748207&proxyReferer=&proxyReferer=
2018-05-01
[Interface] SOAP WS and RESTful Web Service
해당 글은 필자의 주관적인 경험과 생각을 토대로 작성한 글입니다.
이기종 플랫폼 간 웹서비스로 인터페이스를 하는 경우 보통 SOAP방식과 REST방식을 주로 사용한다. 필자의 경우 레거시 시스템 환경에 따라 동일한 방식을 따라갔었는데 REST보다 SOAP 방식을 많이 사용했었다.
두가지 방식의 선호도는 업무에 따라 차이가 나는것 같다.
웹과 관련있는 업무는 REST를 많이 지향하는것 같고 이기종 플랫폼 간 많은 트랜잭션과 분산처리를 요구하는 업무는 SOAP을 지향하는것 같다.
메시지 구조
SOAP은 XML기반인 SOAP구조이며 HTTP Header에 SOAP Part와 Attachment가 존재한다. SOAP Part에는 SOAP Envelope(SOAP Header, SOAP Body)가 있다. 그리고 SOAP Body에는 Payload(Request, Response), SOAP Fault가 있고 SOAP Header과 SOAP Fault는 Optional이다.
REST에서 주로사용하는 JSON은 HTTP메시지 구조의 Body의 문자열 데이터이다.
{
"payload" : [
{
"key" : "value", "key1" : "value1"
},
{
"message" : {"key2" : "value2", "key3" : "value3"}
}
]
}
표면적으로 XML의 태그가 없어 간결하고 함축적인 부분만 포함되어있는것 같고 String, Number, Array 등 타입을 표현하기 괜찮은것 같다.
약어정리
JSON: JavaScript Object Notation
REST: Representational State Transfer
SOA: Service Oriented Architecture
SOAP: Simple Object Access Protocol
Reference(참조)
https://www.java-success.com/java-web-services-interview-questions-and-answers/
이기종 플랫폼 간 웹서비스로 인터페이스를 하는 경우 보통 SOAP방식과 REST방식을 주로 사용한다. 필자의 경우 레거시 시스템 환경에 따라 동일한 방식을 따라갔었는데 REST보다 SOAP 방식을 많이 사용했었다.
두가지 방식의 선호도는 업무에 따라 차이가 나는것 같다.
웹과 관련있는 업무는 REST를 많이 지향하는것 같고 이기종 플랫폼 간 많은 트랜잭션과 분산처리를 요구하는 업무는 SOAP을 지향하는것 같다.
메시지 구조
SOAP은 XML기반인 SOAP구조이며 HTTP Header에 SOAP Part와 Attachment가 존재한다. SOAP Part에는 SOAP Envelope(SOAP Header, SOAP Body)가 있다. 그리고 SOAP Body에는 Payload(Request, Response), SOAP Fault가 있고 SOAP Header과 SOAP Fault는 Optional이다.
REST에서 주로사용하는 JSON은 HTTP메시지 구조의 Body의 문자열 데이터이다.
{
"payload" : [
{
"key" : "value", "key1" : "value1"
},
{
"message" : {"key2" : "value2", "key3" : "value3"}
}
]
}
표면적으로 XML의 태그가 없어 간결하고 함축적인 부분만 포함되어있는것 같고 String, Number, Array 등 타입을 표현하기 괜찮은것 같다.
약어정리
JSON: JavaScript Object Notation
REST: Representational State Transfer
SOA: Service Oriented Architecture
SOAP: Simple Object Access Protocol
Reference(참조)
https://www.java-success.com/java-web-services-interview-questions-and-answers/
2018-04-26
[ObjectMapper] java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.canSerialize(Ljava/lang/Class;Ljava/util/concurrent/atomic/AtomicReference;)Z
스프링 4.3.14에서 ObjectMapper관련 jackson의 all 1.9.0, annotations 2.2.2, core 2.9.2, databind 2.2.3 jar파일을 클래스패스에 등록하였다.
org.springframework.web.servlet.mvc.annotaion.AnnotationMethodHandlerAdapter 빈안에 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 구성하였다.
org.springframework.web.servlet.mvc.annotaion.AnnotationMethodHandlerAdapter 빈안에 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter 구성하였다.
※ 기존소스를 일부분 사용하는것이어서 처음에는
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter로 되어있었는데 Class Not Found에러가 발생되고 관련 jar파일 설치중에 빈도 변경이 되어었다.
org.springframework.http.converter.json.MappingJacksonHttpMessageConverter로 되어있었는데 Class Not Found에러가 발생되고 관련 jar파일 설치중에 빈도 변경이 되어었다.
Symptom(징후)
클라이언트의 Ajax호출 시 서버에서 ObjectMapper방식으로 Json타입 리턴할려고 할때 아래와 같은 에러가 발생되었다.
클라이언트의 Ajax호출 시 서버에서 ObjectMapper방식으로 Json타입 리턴할려고 할때 아래와 같은 에러가 발생되었다.
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.canSerialize(Ljava/lang/Class;Ljava/util/concurrent/atomic/AtomicReference;)Z
Reason(원인)
구글에 검색했을때 해결책중 관련 라이브러리 충돌에 대한 내용도 있어서 삭제하고 추가하는 작업을 하였지만 해결을 못하였다.
구글에 검색했을때 해결책중 관련 라이브러리 충돌에 대한 내용도 있어서 삭제하고 추가하는 작업을 하였지만 해결을 못하였다.
Solution(해결)
ObjectMapper 방식은 사용을 못하고 번거로움이 있지만 response 객체에 Json타입 문자열을 생성해서 리턴주는 방식으로 처리를 하였다.
이방식은 문자열로 Json규칙에 맡게 생성해주다보니 Ajax에서 리턴받을때 에러가 번번이 발생하였으며 익숙해지니 괜찮았다.
ObjectMapper 방식은 사용을 못하고 번거로움이 있지만 response 객체에 Json타입 문자열을 생성해서 리턴주는 방식으로 처리를 하였다.
이방식은 문자열로 Json규칙에 맡게 생성해주다보니 Ajax에서 리턴받을때 에러가 번번이 발생하였으며 익숙해지니 괜찮았다.
Reference(참조)
2018-04-25
[CXF 3.2.1] javax.bind.UnmarshalException: prefix dpp is not bound to a namespace - with linked exception
스프링 4.3.14에서 CXF 3.2.1 버젼의 웹서비스 환경과 웹서비스 관련 클래스를 구성했다.
WSDL 배포를 정상적으로 하고 SOAPUI에서 웹서비스 호출 후 리턴을 정상적으로 리턴을 받는것을 확인하였다. 근데 주기적으로 위와 같은 에러가 발생하였다. 이전프로젝트에서도 웹서비스 구현시 동일한 현상으로 DB배치 방식으로 변경을 하였는데 원인이 궁금하다.
구글에 에러를 검색하여 나온 해결책 몆가지를 적용하였만 해결되지 못하였다. 뭔가 놓지는 부분이 있는것 같은데 누군가 조언을 해주시면 좋겠다.
WSDL 배포를 정상적으로 하고 SOAPUI에서 웹서비스 호출 후 리턴을 정상적으로 리턴을 받는것을 확인하였다. 근데 주기적으로 위와 같은 에러가 발생하였다. 이전프로젝트에서도 웹서비스 구현시 동일한 현상으로 DB배치 방식으로 변경을 하였는데 원인이 궁금하다.
구글에 에러를 검색하여 나온 해결책 몆가지를 적용하였만 해결되지 못하였다. 뭔가 놓지는 부분이 있는것 같은데 누군가 조언을 해주시면 좋겠다.
Symptom(징후)
여러 메시지
javax.bind.UnmarshalException: prefix dpp is not bound to a namespace - with linked exception
java.lang.IllegalArgumentException: prefix dpp is not bound to a namespace
여러 메시지
javax.bind.UnmarshalException: prefix dpp is not bound to a namespace - with linked exception
java.lang.IllegalArgumentException: prefix dpp is not bound to a namespace
Reason(원인)
Solution(해결)
2018-03-07
[Interface] Configuration of CXF Environment in Eclipse
Environment for Installation(설치환경)
Windows 7 64bit
Eclipse 4.7 Oxygen
JAVA 1.8
Tomcat 7.0
apache-cxf-3.2.1.zip
Sequence for Installation(설치순서)
1. 플러그인 설치
Help > Install New Software... > URL 입력한다.
http://download.eclipse.org/webtools/updates
Web Tool Platform (WTP) 3.1.2 > CXF Web Services (Incubation) 선택 후 설치한다.
2 CXF파일 추가
Apache 사이트에서 apache-cxf-3.2.1.zip를 다운로드한다.
Window > Preferences > Web Services > CXF 2.x Preferences에서 파일 추가한다.
3. 테스트
• 이클립스에서 WSDL를 설치해서 웹서비스 호출
WSDL파일에 오른쪽 버튼 > Web Service > Generate Client 클릭
CXF는 AXIS와 다르게 웹서비스를 호출할수 있는 Class가 별도로 생성된다.
• 웹서비스 생성
웹서비스 Class에대한 WSDL를 생성 후 정상적으로 호출 후 리턴데이터를 잘 받았다. 하지만 아래와 같은 에러가 주기적으로 발생되었다.
javax.xml.bind.UnmarshalException: prefix wsdp is not bound to a namespace -with linked exception: [java.lang.IllegalArgumentException: prefix wsdp is not bound to a namespace']
Windows 7 64bit
Eclipse 4.7 Oxygen
JAVA 1.8
Tomcat 7.0
apache-cxf-3.2.1.zip
Sequence for Installation(설치순서)
1. 플러그인 설치
Help > Install New Software... > URL 입력한다.
http://download.eclipse.org/webtools/updates
Web Tool Platform (WTP) 3.1.2 > CXF Web Services (Incubation) 선택 후 설치한다.
2 CXF파일 추가
Apache 사이트에서 apache-cxf-3.2.1.zip를 다운로드한다.
Window > Preferences > Web Services > CXF 2.x Preferences에서 파일 추가한다.
3. 테스트
• 이클립스에서 WSDL를 설치해서 웹서비스 호출
WSDL파일에 오른쪽 버튼 > Web Service > Generate Client 클릭
CXF는 AXIS와 다르게 웹서비스를 호출할수 있는 Class가 별도로 생성된다.
• 웹서비스 생성
웹서비스 Class에대한 WSDL를 생성 후 정상적으로 호출 후 리턴데이터를 잘 받았다. 하지만 아래와 같은 에러가 주기적으로 발생되었다.
javax.xml.bind.UnmarshalException: prefix wsdp is not bound to a namespace -with linked exception: [java.lang.IllegalArgumentException: prefix wsdp is not bound to a namespace']
2017-12-11
[Swift] iOS Development Enviroment Configuration
Prerequisites(전제조건)
Xcode 8.3 개발 툴을 다운로드 받기 위해서는 OS X 버전 10.12 이상 필요하며 필자의 macOS 버젼은 OS X Yosemite 10.10.5 이다.
App Store에서 Xcode를 다운로드 받아 설치해야한다.
Procedure(순서)
1. Playground 생성
Get started with a playground > Next 한다.
playground에서 테스트 코딩을 하는데 JAVA처럼 System.out.print 를 사용할 필요 없이 컴파일 후 오른쪽 레이아웃에 바로 출력되니 편한부분이 있다.
2. Project 생성
File > New > Project 클릭한다.
iOS > Single View Application > Next 클릭한다.
그밖에 project 템플릿에는 watchOS, tvOS, macOS, Cross-platform 제공하며 Objective-C, Swift 언어중 선택해서 개발 가능하다.
3. 프로젝트 설정 후 빌드하게 되면 아이폰 시뮬레이터가 나오게 되며 command + 1~5를 누르게 되면 크기를 조절할 수 있다.
4. .storyboard 클릭 후 오른쪽 하단에 Label를 검색해서 추가할 수 있다.
Reference(참조)
40시간만에 Swift로 iOS 앱 만들기
Xcode 다운로드
macOS 시에라(Sierra) 업그레이드, 사전 준비 이렇게
Xcode 8.3 개발 툴을 다운로드 받기 위해서는 OS X 버전 10.12 이상 필요하며 필자의 macOS 버젼은 OS X Yosemite 10.10.5 이다.
App Store에서 Xcode를 다운로드 받아 설치해야한다.
Procedure(순서)
1. Playground 생성
Get started with a playground > Next 한다.
playground에서 테스트 코딩을 하는데 JAVA처럼 System.out.print 를 사용할 필요 없이 컴파일 후 오른쪽 레이아웃에 바로 출력되니 편한부분이 있다.
2. Project 생성
File > New > Project 클릭한다.
iOS > Single View Application > Next 클릭한다.
그밖에 project 템플릿에는 watchOS, tvOS, macOS, Cross-platform 제공하며 Objective-C, Swift 언어중 선택해서 개발 가능하다.
3. 프로젝트 설정 후 빌드하게 되면 아이폰 시뮬레이터가 나오게 되며 command + 1~5를 누르게 되면 크기를 조절할 수 있다.
4. .storyboard 클릭 후 오른쪽 하단에 Label를 검색해서 추가할 수 있다.
Reference(참조)
40시간만에 Swift로 iOS 앱 만들기
Xcode 다운로드
macOS 시에라(Sierra) 업그레이드, 사전 준비 이렇게
2017-05-17
[Swift] Swift Grammar
Swift 특징
자바에서 사용되는 세미콜론이나 조건문의 괄호는 Swift에서는 사용되지 않는다.
변수와 상수
타입 어노테이션을 사용하여 var height: Float = 55.3 타입처럼 명시할수 있으며 자바의 제네릭과 비슷하다.
배열과 딕셔너리
배열과 딕셔너리에서도 타입 어노테이션을 사용할수 있으며 딕셔너리 같은 경우 자바의 키와 벨류형태인 해쉬맵과 비슷하다.
조건문과 반복문
switch의 case에는 0..<10 처럼 패턴매칭이 가능하며 일반 for문에서 카운터 변수 선언없이 사용 가능하다.
for _ in 0..<10{ //.. }
옵셔널
Swift에서는 옵셔널이라는게 존재하는데 데이터 존재 여부(데이터가 없는 경우 nil를 반환)를 확인 후 다른 변수에 대입을 해주는 것이다.
옵셔널 변수를 선언 후 if문을 사용하여 값이 존재하는 경우 처리하는 로직을 만들수 있으며 사용방법은 아래와 같이 여러가지가 있다.
옵셔널
Swift에서는 옵셔널이라는게 존재하는데 데이터 존재 여부(데이터가 없는 경우 nil를 반환)를 확인 후 다른 변수에 대입을 해주는 것이다.
옵셔널 변수를 선언 후 if문을 사용하여 값이 존재하는 경우 처리하는 로직을 만들수 있으며 사용방법은 아래와 같이 여러가지가 있다.
var optionalVar_1: String? = "test1"
var optionalVar_2: String? = "test2"
if let var1 = optionalVar_1, let var2 = optionalVar_2 {
print(var1)
}
if let number = optionalVar_1, number >= 18 {
//..
}
let array: [String]? = []
var isEmptyArray = false
isEmptyArray = array?.isEmpty == true
2017-05-16
[DB2] Error List
SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=2
수행되는 쿼리에 정의된 컬럼명이 실제 테이블 컬럼명과 일치 않아 발생된 에러였다.
SQLCODE=-668, SQLSTATE=57016, SQLERRMC=7
ALTER TABLE문이 한번 실행되면 테이블이 Reorg보류 상태가 되어 REORG TABLE [테이블명] 쿼리를 실행해야 한다.
SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null
한글데이터로 인한 데이터 사이즈와 실제 컬럼 사이즈와 상이하여 에러가 발생되었다.
SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68
뷰 접근 시 장시간 처리중이거나 에러가 발생되었으며, 처음 뷰를 호출하는 쿼리를 수행하였던 세션으로 인하여 테이블 락이 걸린 상태였다.
이 후로 수행되는 쿼리가 정상적으로 처리되지 못하는 상태이거나 타임아웃 발생 되었으며, 뷰 커리 수정 후 정상처리 되었었다.
SQLCODE=-727, SQLSTATE=56098, SQLERRMC=3
호출하는 뷰에 정되된 테이블이 존재하지 않아 에러가 발생되었다.
수행되는 쿼리에 정의된 컬럼명이 실제 테이블 컬럼명과 일치 않아 발생된 에러였다.
SQLCODE=-668, SQLSTATE=57016, SQLERRMC=7
ALTER TABLE문이 한번 실행되면 테이블이 Reorg보류 상태가 되어 REORG TABLE [테이블명] 쿼리를 실행해야 한다.
SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null
한글데이터로 인한 데이터 사이즈와 실제 컬럼 사이즈와 상이하여 에러가 발생되었다.
SQLCODE=-911, SQLSTATE=40001, SQLERRMC=68
뷰 접근 시 장시간 처리중이거나 에러가 발생되었으며, 처음 뷰를 호출하는 쿼리를 수행하였던 세션으로 인하여 테이블 락이 걸린 상태였다.
이 후로 수행되는 쿼리가 정상적으로 처리되지 못하는 상태이거나 타임아웃 발생 되었으며, 뷰 커리 수정 후 정상처리 되었었다.
SQLCODE=-727, SQLSTATE=56098, SQLERRMC=3
호출하는 뷰에 정되된 테이블이 존재하지 않아 에러가 발생되었다.
2017-01-31
[Maven] org.apche.catalina.LifecycleException: Failed to start component..
Symptom(징후)
64비트 메이븐 프로젝트 환경에서 32비트 환경으로 변경 후 톰켓 7.0 기동시 에러발생
Solution(해결)
workspace > .metadata 폴더 삭제 > 프로젝트 다시 임포트 > 메이븐 메뉴 Udata Project.. 실행 후 정상적으로 기동 되었음
2015-10-07
Install for APMSETUP7(XE)
2017.05.16
APMSETUP7이 갑자기 사용이 중지 된것 같으며, 홈페이지 접속에는 이상이 없지만 프로그램을 정상적으로 사용할 수 없어 오토셋이나 XAMPP로 변경해서 사용하고 있다.
Environment for Installation(설치환경)
Windows 7 Professional K Service Pack 1
Preparing for Installation(설치준비)
APMSETUP7_2010010300.exe
php-5.4.44-Win32-VC9-x86.zip
xe.zip
Sequence for Installation(설치순서)
1. APMSETUP7_2010010300.exe 설치
APMSETUP7을 설치 완료하면 Monitor에 Apache2와 MySQL5이 정상적으로 구동되는 상태를 확인할 수 있다.
Reference(참조)
APMSETUP7이 갑자기 사용이 중지 된것 같으며, 홈페이지 접속에는 이상이 없지만 프로그램을 정상적으로 사용할 수 없어 오토셋이나 XAMPP로 변경해서 사용하고 있다.
Environment for Installation(설치환경)
Windows 7 Professional K Service Pack 1
Preparing for Installation(설치준비)
APMSETUP7_2010010300.exe
php-5.4.44-Win32-VC9-x86.zip
xe.zip
Sequence for Installation(설치순서)
1. APMSETUP7_2010010300.exe 설치
APMSETUP7을 설치 완료하면 Monitor에 Apache2와 MySQL5이 정상적으로 구동되는 상태를 확인할 수 있다.
2. XE 설치(PHP버전 업그레이드)
APM이 설치된 디렉토리에 압축된 xe.zip을 풀어준 후 XE를 설치하는 과정에 PHP버전 5.3에서는 설치가 불가능하다고 나온다.
이런경우에는 APM이 설치된 디렉토리에 PHP5를 백업받은 후 php-5.4.44-Win32-VC9-x86.zip를 PHP5와 동일한 명으로 압축을 풀어준다. 그리고 Apache2를 재기동 후 PHP버전이 5.4인것을 확인할 수 있다.
3. XE 설치
XE 테이블이 설치되는 DB를 미리 생성 후에 순서대로 설치작업을 진행하면된다.
Reference(참조)
APMSETUP7 업그레이드 PHP부분
2015-09-02
Install for Sublime Text2
Environment for Installation(설치환경)
Windows10 Professional 64bit
Preparing for Installation(설치준비)
Sublime text 2
Sublime text 2
Sequence for Installation(설치순서)
1. View > Show Console이나 Ctrl + `를 클릭하여 아래의 명령어 입력하여 설치 후 재 시작 한다.
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')
2. Tools > Command Palette...이나 Ctrl + Shift, P를 클릭하여 Package Install를 수행한다.
3. Plug-in 설치
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')
2. Tools > Command Palette...이나 Ctrl + Shift, P를 클릭하여 Package Install를 수행한다.
3. Plug-in 설치
ㆍIndent XML
:XML를 정렬하기 위해 설치하였으며, 정렬 단축키는 Ctrl+K, F 이다.
ㆍBracketHighlighter
:태그의 시작과 끝을 눈에 잘 띄게 해준다.
:태그의 시작과 끝을 눈에 잘 띄게 해준다.
ㆍConvertToUTF8
:한글깨짐 현상을 대비하여 설치하였다.
:한글깨짐 현상을 대비하여 설치하였다.
ㆍSublimerge Pro
:소스를 비교하기 위해 설치하였다.
:소스를 비교하기 위해 설치하였다.
2014-08-10
[Oracle 11g] Oracle 11g에서 ORA-01033 ORACLE initialization or shutdown in progress Error
Symptom(징후)
오라클 접속 시 ORA-01033 ORACLE initialization or shutdown in progress 에러 발생
Solution(해결)
C:\app\series7\product\11.2.0\dbhome_1\BIN> sqlplus sys/password as sysdba
SQL> recover database
SQL> alter database open
SQL> shutdown immediate
SQL> startup
위 명령어를 입력 중에
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: 'C:\SOFTWAREAG8\COMMON\DB\SCRIPTS\ORACLE\STORAGE\25\CREATE\ORCL\DATAFILE\O1_MF_WEBMDATA_9Y5P9KMP_.DBF' 에러가 발생되면
SQL> alter database datafile 'C:\SOFTWAREAG8\COMMON\DB\SCRIPTS\ORACLE\STORAGE\25\CREATE\ORCL\DATAFILE\O1_MF_WEBMDATA_9Y5P9KMP_.DBF' offline drop;
Reference(참조)
ORA-01033: ORACLE initialization or shutdown in progress -
http://purplike.tistory.com/309
오라클 접속 시 ORA-01033 ORACLE initialization or shutdown in progress 에러 발생
Solution(해결)
C:\app\series7\product\11.2.0\dbhome_1\BIN> sqlplus sys/password as sysdba
SQL> recover database
SQL> alter database open
SQL> shutdown immediate
SQL> startup
위 명령어를 입력 중에
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: 'C:\SOFTWAREAG8\COMMON\DB\SCRIPTS\ORACLE\STORAGE\25\CREATE\ORCL\DATAFILE\O1_MF_WEBMDATA_9Y5P9KMP_.DBF' 에러가 발생되면
SQL> alter database datafile 'C:\SOFTWAREAG8\COMMON\DB\SCRIPTS\ORACLE\STORAGE\25\CREATE\ORCL\DATAFILE\O1_MF_WEBMDATA_9Y5P9KMP_.DBF' offline drop;
Reference(참조)
ORA-01033: ORACLE initialization or shutdown in progress -
http://purplike.tistory.com/309
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file ORA-01110: data file 6: '/opt/oracle/db02/nms_index.dbf' -
http://anuragkumarjoy.blogspot.kr/2013/11/ora-01157-cannot-identifylock-data-file.html
피드 구독하기:
글 (Atom)
-
2026년 1월 21일 국내 주식 시장 은 변동성이 매우 큽니다. 초보 투자자분들을 위해 오늘 장을 움직일 주식 테마 분석 을 진행하고, 원전 및 로봇 관련주 등 꼭 확인해야 할 종목들을 정리해 드립니다. 현재 시장은 트럼프 행정부의 정책 리스크와 미...
-
국내 주식시장은 매일 다양한 뉴스와 이벤트로 움직입니다. 오늘은 호재 vs 악재 지수 를 통해 시장 분위기를 정리하고, 투자자들이 이해하기 쉽게 주요 포인트를 알려드리겠습니다. 📑 목차 (Table of Contents) 국내 주식시장 분위...
-
2025년 9월 초 국내 주식시장은 호재와 악재가 동시에 맞물린 혼조세 를 보이고 있습니다. 글로벌 채권 금리 급등, 미중 갈등, 국내 노사 리스크 같은 불안 요인과 함께, AI·조선·방산·바이오 같은 성장 테마가 시장을 떠받치는 모습입니다. 오늘은 ...

















