728x90
반응형
728x90
반응형
728x90
반응형

자산이 많이 형성되어 있지 않은 2030세대들은 은행, 보험사, 증권사 중 어느 곳에서 자금을 굴려 투자를 해야 할지 잘 모를 수 있다. 우선 시간이 많을수록 리스크를 감수하고 투자해야 하는 것을 알 것이다. 나이가 어릴수록 적극적으로 투자할 필요가 있다. 2030 세대의 가장 큰 장점은 시간이다.

 

변액연금보험 VS 연금저축펀드

2030 세대가 보험사에서 판매하는 변액연금보험과 증권사에서 판매하는 연금저축펀드 중 어떤 상품에 가입할지를 고민하고 있다고 해보자. 

간단하게 비교하면 변액연금보험은 사업비와 펀드보수 수수료를 납입하고 본인이 고른 펀드를 운용해 달라고 하는 상품이다. 연금저축펀드는 본인이 직접 ETF를 골라 운용할 수 있는 상품이다.

필자는 두 상품 모두 가입해서 운용했었다. 필자가 사회초년생일 때는 ETF를 직접 거래하는 연금저축펀드는 없었기 때문에 변액연금보험만 갖고 있다가 추후에 연금저축펀드에 가입했다.

2030세대들이 자산관리에 이제 관심을 갖기 시작한 경우라면 변액연금보험은 쳐다도 보지 말고 증권사로 가서 연금저축펀드만 가입하기를 권한다.

 

변액연금보험

어떤 이유로 변액연금보험은 쳐다도 보지 말라고 했는지 설명하기 위해 필자가 기존에 갖고 있던 변액연금보험 수익률을 공개하겠다. 

가입일이 2011년 5월이니까 무려 가입한지 14년이 지난 모 생명보험사의 변액연금보험 수익률이다.

블루칩주식혼합형
배당주식혼합형

 

변액연금보험은 펀드로만 포트폴리오를 구성할 수 있다. 그리고 거의 대부분 국내 주식과 채권에 투자하는 펀드만 있다. 

또한 내가 낸 보험료를 전부 투자하는 것도 아니다. 사업비, 펀드보수, 위험보험료 등등을 떼가고 남은 돈을 투자한다. 사업비는 무려 7.8%나 된다. 

사업비

 

먼저 블루칩주식혼합형의 누적수익률은 26.5%이다. 연수익률이 1.89%이다.

두 번째 배당주식혼합형의 누적수익률은 그나마 조금 높아 39%이다. 연수익률로 따지면 2.78%이다.

 

위에 보여드린 수익률에서도 알 수 있듯이 이제 누구나 다 아는 사실이 되어 설명할 필요도 없지만 국내주식에 장기투자를 하면 안 된다. 연수익률이 1.89%면 이자배당소득세를 내고도 예금이자보다 못하다. 여기에 14년의 물가상승률까지 적용하면 실질 이자는 마이너스다. 

주식은 하이리스크 하이리턴이라고 하지 않았나? 그런데 국내주식은 하이리스크 로우리턴이다.

 

또한 변액연금보험에 가입하면 매달 보험사에 내 돈 잘 관리해 달라고 적지 않은 수수료를 낸다. 그런데 수익률은 형편없는 것이다. 예금이자보다 못한 수익률을 내는 전문가라고 잘못 알려져 있는 집단에게 고액의 사업비를 내고 있는 것이다. 그 돈이 어떤 돈인지 한번 생각해 보자. 직장 상사한테 까이고 욕먹고 고객한테 굽신거리고 비위 맞추고 몸 상해가면서 받은 소중한 돈이다.

 

연금저축펀드

이번에는 필자의 연금저축펀드 수익률을 공개하겠다. 2022년 말부터 꾸준히 적립하고 있는데 누군가는 뭐 대단하지도 않네 할 수도 있겠다. 

연금저축펀드 누적수익률

 

어쨋든 연금저축펀드에 꾸준히 적립한 결과 24년 9월 23일 현재 기준 19.47% 수익률을 기록 중이다. 2년이 안 되었으니 연 수익률은 9.7%가 넘는다. 여기서 중요한 것은 계속 신경 쓰지 않고 매달 같은 날에 ETF를 매수하기만 했다는 것이다. 

 

이런 수익률이 어떻게 가능한지 이유를 살펴보자.

 

1. 변액연금보험과 다르게 연금저축펀드는 주식투자하는 것처럼 증권사에서 ETF에 직접 투자할 수 있다. 

2. 해외 직접 투자는 불가능하지만 국내 증권사에서 발행한 해외 ETF에 투자할 수 있다.

3. 해외 ETF 중 미국 미중이 높다.

 

미국 S&P500 2011년부터 현재까지의 연간 차트를 보자. 

S&P500 14년 차트

무려 530% 상승했다. 연 평균 수익률이 37%다. 참고로 나스닥은 더 높다. 같은 기간 730% 상승했다. 연평균 수익률이 52%다.

 

다음 포스팅에는 필자가 연금저축펀드에 어떤 ETF로 구성했는지, 매달 얼마의 금액을 납입하고 있는지 알려드리도록 하겠다. 

 

결론

노후대비를 위해 연금개시일부터 연금을 받는 형식의 상품에 가입하면 세금이연으로 연금세율 3.3% ~ 5.5%로 절세효과를 누릴 수 있다. 위의 내용을 바탕으로 펀드보다 훨씬 수수료도 적고 주식처럼 거래가 가능하고 자산배분 효과도 있는 ETF를 적극적으로 이용할 수 있는 연금저축펀드에 가입하도록 하자. 

 

추가로 증권사에서 연금저축펀드 거래 수수료 이벤트를 할 때 맞춰 가입하도록 하자. 절세효과에 거래 수수료도 아낄 수 있을 것이다.

 

해당 컨텐츠는 종목 추천이 아닌 정보 제공을 목적으로 합니다. 투자 결정은 전적으로 본인 판단과 책임하에 이루어져야 하며, 필자는 본 자료에 의거한 투자행위에 대한 어떠한 책임도 지지 않습니다.

 

728x90
반응형
728x90
반응형

 개인 자산관리의 시작은 보장성보험의 가입이다. 왜냐하면 개인이 관리해야할 자산 중 가장 중요한 자산은 바로 나 자신이기 때문이다. 그래서 개인이 자산관리를 시작하는 단계라면 보장성보험 가입을 우선적으로 고려해야 한다. 실손의료보험 같은 경우 부모님이 가입해주시는 경우가 많아졌지만 스스로 자산관리를 시작해야 하는 사람이라면 반드시 보장성보험부터 시작해야 한다. 설령 부모님이 가입해주셨더라도 보장범위가 어떻게 되는지 살펴볼 필요가 있다.

 

보장성보험

 

보장성보험이란

 보장성보험은 사고, 질병 등의 위험으로부터 경제적 손실을 대비하는 보험이다. 암보험, 실손의료보험, 운전자보험 등을 말한다.

이 보험의 특징은 보험료가 상대적으로 저렴하며, 만기 시 환급금이 거의 없거나 없기 때문에, 순수하게 위험에 대한 보장만을 받는 것이 목적이다. 따라서 보장성보험은 만기까지 사고가 발생하지 않으면 보험차익(= 수령보험금 - 납입보험료)이 발생할 수 없는 상품이다.

 

보장성보험

 

 

보장성보험의 세제 혜택

보장성보험에 가입한 경우에는 근로소득자의 연말정산시 보험료세액공제를 통해 연간 납입보험료(100만원 한도)의 12%(장애인전용보장성보험료는 15%)를 세액공제 해준다. 근로소득자를 대상으로 세액공제되는 보장성보험은 생명보험, 상해보험, 손해보험 등으로 보험계약 또는 보험료 납입영수증에 보험료 공제대상이 표시되어 있는 보험을 말한다.

 

보장성보험 가입시 고려사항

1. 본인이 알아보고 가입하자

보험은 한 번 가입하면 오랜 시간동안 보험료를 납입해야 한다. 그리고 중간에 해지하기도 힘들다. 중도해지하면 대부분 손해보는 구조로 되어 있기 때문이다. 그러므로 처음 가입할 때 시간이 걸리더라도 상품을 꼼꼼히 파악하고 가입 해야 한다. 공부하기 귀찮고 시간이 없다는 핑계로 보험 관련 일을 하는 친척이나 친구에게 가입을 맡기지 말자. 그런 연고방식의 보험 마케팅에 수많은 사람들이 매달 수십만원의 종신보험에 가입해 해지하지도 못하고 보험사의 노예가 된 것을 기억하자.

 

2. 보장성보험의 보험료는 매달 10만원 내외가 적정

보장성보험 중 필수로 가입할 보험은 실비의료보험과 암보험, 운전을 한다면 운전자보험에 가입할 것을 추천한다. 보장성보험은 이 정도면 충분하다고 생각한다. 기본 설계된 보장범위 안에서 개인적으로 필요하다 싶은 보장을 추가로 가입하면 실비의료보험, 암보험, 운전자보험의 보험료는 매달 10만원 내외가 될 것이다.

사고나 질병이 생길 것을 생각해 미리 이 정도만 준비하고 보험료를 더 낼 바에 그 돈으로 다른 재테크를 해서 돈을 불리는 것이 낫다는 생각이다.

해당 컨텐츠는 종목 추천이 아닌 정보 제공을 목적으로 합니다. 투자 결정은 전적으로 본인 판단과 책임하에 이루어져야 하며, 필자는 본 자료에 의거한 투자행위에 대한 어떠한 책임도 지지 않습니다. 

 

728x90
반응형
728x90
반응형

기본 개념을 이해하는 것이 중요하므로 간단하게 다음과 같이 1부터 10까지 리스트에 추가합니다.

    List<Integer> list = new ArrayList<>();
    
    for(int i=1;i<=10;i++) {
        list.add(i);
    }
    System.out.println(list);

print하면 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]가 출력됩니다.

 

여기서 삭제하고 싶은 값이 10이라고 해보고 다음과 같이 입력해본다고 합시다.

    list.remove(10);

remove메소드의 파라미터는 index값을 받게 되어 있습니다.

index는 0부터 시작하므로 위에 있는 list객체에는 10번의 index가 존재하지 않아 IndexOutOfBoundsException가 발생하게 됩니다.

 

여기서 숫자 10을 삭제하고 싶을 때 어떻게 해야 할까요?

    list.remove(new Integer(10));
    
    System.out.println(list);

위와 같이 래퍼 클래스(Wrapper Class)로 감싸서 파라미터 값을 넘겨주면 됩니다.

 

이제 출력값은 다음과 같습니다.

[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

우리가 원했던대로 10이 삭제되었습니다.

 

Java에서 수치나 논리값은 객체가 아니라 기본형으로 관리됩니다. 그런데 List나 Map과 같은 컬렉션 클래스 안에서는 객체만 저장할 수 있습니다. 그렇기 때문에 기본형을 객체로 감싸줘야 하는데 이러한 역할을 하는 것이 래퍼 클래스입니다. 

 

이러한 개념을 바탕으로 List에 숫자 10을 담기 위해서는 다음과 같이 해야 합니다.

    int ten = 10;
    
    Integer wrap_ten = new Integer(ten);
    
    List<Integer> list = new ArrayList<>();
    list.add(wrap_ten);
    
    System.out.println(list);

그런데 굳이 위처럼 하지 않고 다음과 같이 int값을 바로 넣어도 List에 추가가 되는 것을 알 수 있습니다.

    int ten = 10;

    List<Integer> list = new ArrayList<>();
    list.add(ten);
    
    System.out.println(list);

자바가 자동으로 int값을 래퍼 클래스로 변환해주기 때문입니다. 참고로 기본형에서 래퍼 클래스로 변환해주는 것을 '오토박싱'이라고 합니다. 

 

다시 이 글의 주제인 'List에서 특정 index가 아닌 원하는 값 삭제'로 돌아가 보겠습니다.

반응형

 

그러면 왜 remove 메소드에 10을 넘겼을 때 왜 래퍼 클래스로 변환해주지 않는 것이냐 라는 의문이 들 수 있습니다. 

 

List 객체의 특성을 다시 생각해보면 됩니다.

List에서 어떠한 작업을 하기 위한 키는 기본적으로 index입니다. 그러므로 remove 메소드 파라미터의 기본은 index인 것입니다. 몇 번째 index에 위치한 것을 우리가 호출한 메소드에 맞게 처리해라가 기본인 것입니다. 

 

그러므로 List에서 index가 아니라 우리가 생각하는 그 숫자를 삭제하려면 래퍼 클래스로 감싸서 파라미터로 넘겨야 합니다. 

 

그렇다면 Java가 List 안에서 우리가 생각하는 것처럼 숫자 10을 인식해서 삭제하는 것일까요?

 

객체의 기본 개념을 생각해봅시다. 이해하기 쉽게 객체는 주소와 값으로 구성된 map과 같은 것입니다. 파이썬에서는 Dictionary 같은 것입니다. 

 

이 글 처음에 for문을 이용해서 1부터 10까지 숫자를 List에 추가하였습니다. 이 때 내부적으로 1부터 10까지 각각 래퍼 클래스로 전부 감싼 후 List에 추가한 것입니다. 그러므로 1부터 10까지 숫자가 있는 것이 아니라 1부터 10까지 주소와 값으로 구성된 객체 10개가 만들어진 것입니다.

 

그러므로 list.remove(new Integer(10))을 실행했을 때 자바가 List 안에서 숫자 10을 인식한 게 아니라 10이 위치한 주소를 찾아 그 객체를 삭제한 게 되는 것입니다.

 

 

 

 

728x90
반응형

'AI & 프로그래밍 > Java' 카테고리의 다른 글

[자바] Open API에서 xml 파싱(parsing)하기  (0) 2020.12.17
728x90
반응형

이번 포스팅에서는 controller 파일을 생성 후 was를 실행하지 않고 controller 테스트를 진행해보도록 하겠습니다.

 

먼저 스프링 프레임워크에서 어떤 설정이 필요한지 확인해보겠습니다.

 

스프링 프레임워크에서 controller 파일을 인식시키려면 controller class 위에 @Controller 어노테이션을 작성하면 됩니다.

 

다음으로 이 @Controller 어노테이션을 인식하게 하려면 src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml 파일을 살펴봐야 합니다.

 

아래 그림에 보면 component-scan context를 설정한 부분이 있는데 base-package 속성값에 @Controller 어노테이션을 자동으로 인식시키고자 하는 폴더명을 지정해야 합니다.

 


이제 controller 파일을 생성하고 JSON데이터를 리턴하는 코드를 작성해보도록 하겠습니다.

 

스프링에서 JSON 처리를 하기 위해서는 jackson-databind 라이브러리를 추가해야 합니다.

 

다음과 같이 pom.xml에 추가합니다.

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.12.0</version>
</dependency>

 

그 다음 VO 객체를 만듭니다.

 

다음과 같이 Stock 클래스 파일을 만들겠습니다.

import lombok.Data;

@Data
public class Stock {
	private String code;
	private String name;
}

 

Stock 객체에 종목코드와 종목명을 넣고 JSON으로 리턴하는 클래스 파일을 만들겠습니다.

 

StockController 클래스를 다음과 같이 작성합니다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.kenmiles.hellojarvis.web.entity.Stock;

@Controller
public class StockController {
	
	@RequestMapping("/setVO")
	public @ResponseBody Stock setVO(){
		Stock vo = new Stock();
		vo.setCode("005930");
		vo.setName("삼성전자");
		
		return vo;
	}
	  
}

 

여기서 주의할 점은 리턴타입에 @ResponseBody 어노테이션을 추가해야 한다는 점입니다.

 

위 controller가 정상적으로 실행되는지 확인하기 위해서는 보통 톰캣을 실행해 브라우저 창에 주소를 입력해서 확인합니다.

 

하지만 이번 포스팅에서는 톰캣 실행 없이 controller 파일이 정상 실행되는지 확인해보도록 하겠습니다.

 

톰캣 실행 없이 controller를 테스트하기 위해서 브라우저에서 요청과 응답하는 과정을 대신처리할 수 있는 MockMvc를 이용하겠습니다.

 

다음과 같이 JUnit Test 파일을 생성합니다.

import java.nio.charset.Charset;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.kenmiles.hellojarvis.web.controller.StockController;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class sampleControllerTest {

	private static final Logger logger = LoggerFactory.getLogger(sampleControllerTest.class);

	@Autowired
	StockController stockController;
	
	private MockMvc mockMvc;
	
    private MediaType contentType = new MediaType(MediaType.APPLICATION_JSON.getType(),
            MediaType.APPLICATION_JSON.getSubtype(),
            Charset.forName("utf8"));

	@Before
	public void setup(){
		mockMvc = MockMvcBuilders.standaloneSetup(stockController).build();
		logger.info("setup......");
	}
	
	@Test
	public void testGetData()throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/setVO")
				.contentType(contentType))
		.andExpect(MockMvcResultMatchers.status().isOk())
		.andDo(MockMvcResultHandlers.print()); 

	}
}

이 코드에서 일반 자바를 테스트할 때와 다른 점은 @WebAppConfiguration 어노테이션을 추가한 것과 servlet-context.xml을 읽도록 하기 위해 WEB-INF/spring 폴더 아래 xml파일을 전부 인식하도록 했다는 점입니다.

 

테스트를 하고자 하는 controller 파일을 @Autowired로 주입하고 해당 객체를 setup메소드에서 mockMvc 객체로 초기화합니다.

 

<Ctrl> + <F11>로 실행하면 다음과 같이 status가 200이 나타나고 Body에 controller 파일에서 리턴한 JSON 값이 표시되어 있는 것을 확인할 수 있습니다.

 

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 API를 호출했을 때 xml로 출력되는 자료를 파싱(parsing)하는 방법에 대해 알아보도록 하겠습니다.

 

예제를 위해 opendart 사이트에 접속해 회원가입하고 API 이용하기 위한 인증키를 신청합니다.

 

opendart.fss.or.kr/

 

전자공시 OPENDART 시스템

--> 시스템 점검으로 모든 서비스 이용이 일시적으로 중단되어니 양해 부탁드립니다. 시스템 점검 일정 2019년12월30일 23:00 ~ 12월31일 24:00 (1시간) *상기 작업 시간은 사정에 의해 변경 될 수 있습니

opendart.fss.or.kr

개발가이드 -> 사업보고서 주요정보에서 증자(감자) 현황 정보를 가져와 보도록 하겠습니다.

 

맨 오른쪽에 바로가기를 클릭합니다.

개발가이드에 보면 기본 정보, 요청 인자, 응답 결과 정보를 확인할 수 있고 화면 아래로 더 내려보면 다음과 같이 OpenAPI 테스트도 해볼 수 있습니다.

 

XML로 파싱할 것이기 때문에 XML을 선택하고 검색을 누릅니다.

API 결과에 요청인자에 따른 url 주소와 요청한 결과값이 XML값으로 표시되는 것을 볼 수 있습니다.

 

이제 url을 호출해서 XML값을 파싱하는 작업을 자바로 구현해보겠습니다.

 

자바파일로 만들어도 되고 JUnit 테스트 코드로 작성해도 됩니다.

 

다음과 같이 자바 파일을 작성합니다.

import java.net.URLDecoder;

import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class xmlParsingTest {

	// tag값의 정보를 가져오는 메소드
	private static String getTagValue(String tag, Element eElement) {
	    NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes();
	    Node nValue = (Node) nlList.item(0);
	    if(nValue == null) 
	        return null;
	    return nValue.getNodeValue();
	}

	@Test
	public void test() {
		try{
			// parsing할 url 지정(API 키 포함해서)
			String url = "https://opendart.fss.or.kr/api/irdsSttus.xml";
			String serviceKey = "인증키";
			String decodeServiceKey = URLDecoder.decode(serviceKey, "UTF-8");
			String corpCode = "00293886"; //공시대상회사의 고유번호(8자리)
			String bsnsYear = "2018"; //사업연도(4자리)
			String reprtCode = "11011"; //보고서 코드
					
			Document documentInfo = DocumentBuilderFactory
					.newInstance()
					.newDocumentBuilder()
					.parse(url+"?crtfc_key="+decodeServiceKey+"&corp_code="+corpCode+"&bsns_year="+bsnsYear+"&reprt_code="+reprtCode);
			
			// root tag 
			documentInfo.getDocumentElement().normalize();
			//				System.out.println("Root element :" + documentInfo.getDocumentElement().getNodeName());
			
			// 파싱할 tag
			NodeList nList = documentInfo.getElementsByTagName("list");
			//				System.out.println("파싱할 리스트 수 : "+ nList.getLength());
			
			for(int temp = 0; temp < nList.getLength(); temp++){
				Node nNode = nList.item(temp);
				if(nNode.getNodeType() == Node.ELEMENT_NODE){
					
					Element eElement = (Element) nNode;
					System.out.println("######################");
					System.out.println("고유번호  : " + getTagValue("corp_code", eElement));
					System.out.println("법인명  : " + getTagValue("corp_name", eElement));
					System.out.println("주식발행 감소일자 : " + getTagValue("isu_dcrs_de", eElement));
					System.out.println("발행 감소 형태  : " + getTagValue("isu_dcrs_stle", eElement));
					System.out.println("발행 감소 주식 종류  : " + getTagValue("isu_dcrs_stock_knd", eElement));
					System.out.println("발행 감소 수량  : " + getTagValue("isu_dcrs_qy", eElement));
					System.out.println("발행 감소 주당 액면 가액 : " + getTagValue("isu_dcrs_mstvdv_fval_amount", eElement));
					System.out.println("발행 감소 주당 가액  : " + getTagValue("isu_dcrs_mstvdv_amount", eElement));
				}	
			}	
		} catch (Exception e){	
			e.printStackTrace();
		}
	}

}

<Ctrl> + <F11>을 눌러서 실행해보면 다음과 같이 콘솔창에 XML데이터가 파싱되어 표시되는 것을 볼 수 있습니다.

다시 Opendart 사이트로 가서 인증키 신청/관리 -> 오픈API 이용현황에 보면 다음과 같이 일일허용건수와 호출건수를 확인할 수 있습니다.

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 MyBatis를 설정하고 Spring과 MyBatis, DB 서버가 제대로 연결이 되었는지까지 확인해보도록 하겠습니다.

 

MyBatis를 사용하기 위해서는 mybatis-spring과 mybatis 라이브러리가 필요합니다.

 

Maven Repository 사이트에 접속해서 mybatis-spring과 mybatis를 검색합니다.

 

Maven Dependency 코드를 복사해서 pom.xml에 붙여넣기 합니다.

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

 

Mybatis와 스프링 연동 작업에서 가장 중요한 객체인 sqlSessionFactory를 사용할 수 있게 설정하도록 하겠습니다.

 

src/main/webapp/WEB-INF/spring/root-context.xml에 들어가 다음과 같이 설정합니다.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
</bean>

 

dataSource 설정은 다음을 참조하세요.

2020/12/11 - [프로그래밍/Spring Framework] - [JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

 

[JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

이번 포스팅에서는 Spring Maven 프로젝트를 생성 후 MS-SQL과 연결하는 과정을 설명드리겠습니다. MS SQL Server 2019 JDBC Driver 정보가 있는 다음 사이트에 접속합니다. docs.microsoft.com/en-us/sql/connec..

grand-unified-engine.tistory.com

 

MyBatis는 SQL Mapping Framework로 Spring과 별도의 설정 파일을 가질 수 있습니다.

 

src/main/resources 아래 config 폴더를 만들고 mybatis-config.xml 파일을 생성합니다.

 

mybatis-config.xml파일에 다음을 입력합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration></configuration>

 

mybatis-config.xml에 추가로 설정할 것들이 있는데 다음 포스팅 때 하기로 하고 이번 포스팅에서는 기본설정만 하도록 하겠습니다.

 

이렇게 만든 mybatis-config.xml파일을 Spring Framework에서 사용할 수 있게 root-context.xml 파일을 다음과 같이 수정합니다.

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:/config/mybatis-config.xml"></property>
</bean>

 

지금까지 Mybatis 기본 설정을 마쳤습니다.

 

마지막으로 정상적으로 스프링에서 Mybatis와 DB 서버가 잘 연결되는지 확인해보도록 하겠습니다.

 

JUnit Test Case로 테스트 자바파일을 생성합니다.

 

테스트 자바 파일에 다음과 같이 입력합니다.

 

import javax.inject.Inject;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class MyBatisTest {

	//SqlSessionFactory 객체를 자동으로 생성
	@Inject
	private SqlSessionFactory sqlFactory;
		
	//SqlSessionFactory 객체가 제대로 만들어졌는지 Test
	@Test
	public void test() {
		System.out.println(sqlFactory);
	}
	
	//MyBatis와 DB 서버가 제대로 연결되었는지 Test
	@Test
	public void testSession() throws Exception{
		try(SqlSession session = sqlFactory.openSession()){
			System.out.println(session);
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

<Ctrl> + <F11>을 눌러서 결과를 확인하도록 하겠습니다.

 

콘솔창에 다음과 같이 출력되는 것을 볼 수 있습니다.

 

잘 연결된 것을 확인할 수 있습니다.

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 HikariCP로 DB에 접속해보고 springframework의 jdbc driver와의 속도 차이를 확인해보도록 하겠습니다.

 

springframework의 jdbc 설정은 다음 링크를 참조하시기 바랍니다.

2020/12/11 - [프로그래밍/Spring Framework] - [JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

 

[JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

이번 포스팅에서는 Spring Maven 프로젝트를 생성 후 MS-SQL과 연결하는 과정을 설명드리겠습니다. MS SQL Server 2019 JDBC Driver 정보가 있는 다음 사이트에 접속합니다. docs.microsoft.com/en-us/sql/connec..

grand-unified-engine.tistory.com

JUnit 테스트 환경은 다음을 참조하시기 바랍니다.

2020/12/14 - [프로그래밍/Spring Framework] - [JUnit] JUnit으로 테스트 환경 설정하기

 

[JUnit] JUnit으로 테스트 환경 설정하기

안녕하세요 이번 포스팅에서는 이클립스에 JUnit 라이브러리를 추가하고 JUnit 테스트를 할 수 있게 환경을 구성해보겠습니다. 1. Maven Dependancies 추가 JUnit 테스트를 하기 위해서는 두 가지 라이브

grand-unified-engine.tistory.com

springframework의 jdbc 설정은 Spring Bean Configuration File에 다음과 같이 입력합니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/db.properties</value> 
            </list>
        </property>
    </bean>	
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

 

테이블 한개 조회하는 시간을 측정하기 위해 JUnit 테스트를 생성하도록 하겠습니다.

 

프로젝트 선택 후 마우스 오른쪽 -> New ->JUnit Test Case를 클릭하고 자바 파일을 생성합니다.

 

다음과 같이 코드를 입력합니다.

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class dataSourceSpeedTest {

    @Autowired
    private ApplicationContext context;
    
    @Test
    public void test() {
    	Connection conn = null;
        Statement state = null; 
        long start = System.currentTimeMillis();
		
        DataSource ds = (DataSource) context.getBean("dataSource");
		
        try {
        	conn = ds.getConnection();
            state = conn.createStatement();
            String sql; //SQL문을 저장할 String
            sql = "SELECT * FROM 테이블명 ";
            ResultSet rs = state.executeQuery(sql); //SQL문을 전달하여 실행
            
            while(rs.next()){
            	String dpt_cd = rs.getString("DPT_CD"); //조회하려는 필드1
                String dpt_nm = rs.getString("DPT_NM"); //조회하려는 필드2
                System.out.println("dpt_cd: "+ dpt_cd + "\ndpt_nm: " + dpt_nm); 
            }
			
            rs.close();
            state.close();
            conn.close();
            long end = System.currentTimeMillis(); 
            long secDiffTime = (end - start);
            System.out.println("조회시간 : "+secDiffTime/1e3 + "초");
        } catch(Exception e){
			//예외 발생 시 처리부분
        }
    }
}

<Ctrl> + <F11>로 빌드하면 콘솔 창에 다음과 같이 조회시간이 표시됩니다.

 


이번에는 Hikari Connection Pool로 DataSource를 연결 후 같은 소스로 조회시간을 측정해보도록 하겠습니다.

 

먼저 HikariCP 환경 설정을 위해 Maven Repository 사이트에 접속합니다.

 

mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

yang-maven-plugin-spi Last Release on Dec 14, 2020

mvnrepository.com

검색창에 hikaricp를 입력하고 조회합니다.

 

Maven dependency 코드를 복사해서 pom.xml에 붙여넣기합니다.

 

Spring Bean Configuration File에 다음과 같이 Hikari Connection Pool 정보를 입력합니다.

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/db.properties</value> 
            </list>
        </property>
    </bean>	
    
    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>

    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
        <constructor-arg ref="hikariConfig"/>
    </bean>

다시 JUnit Test 소스를 실행해보도록 하겠습니다.

 

자바 파일을 선택 후 <Ctrl> + <F11>을 누릅니다.

 

조회시간이 0.204초가 나옵니다.

 

springframework의 jdbc로 설정했을 때보다 무려 3% 밖에 시간이 안 걸리는 것을 확인할 수 있습니다.

 

조건별로 다른 결과가 나오겠지만 Hikari Connection Pool을 사용하면 시간을 꽤 단축시킬 수 있을 것이라 판단됩니다.

 

지금까지 Hikari Connection Pool로 DB접속할 수 있게 환경을 구성하고 springframework의 jdbc 와 테이블 Full Scan할 때 시간을 비교해보았습니다.    

728x90
반응형
728x90
반응형

안녕하세요

 

이번 포스팅에서는 이클립스에 JUnit 라이브러리를 추가하고 JUnit 테스트를 할 수 있게 환경을 구성해보겠습니다.

 

1. Maven Dependancies 추가

 

JUnit 테스트를 하기 위해서는 두 가지 라이브러리가 필요합니다.

 

springframework spring-test와 JUnit 라이브러리입니다.

 

JUnit 라이브러리의 최신 버전을 확인하기 위해 메이븐 사이트에 접속합니다.

 

mvnrepository.com/

 

Maven Repository: Search/Browse/Explore

Generates Cucumber execution report in PDF format for ExtentReports Last Release on Dec 13, 2020

mvnrepository.com

JUnit 검색하고 2. JUnit 을 클릭합니다.

 

원하는 버전을 선택 후 클릭하면 Maven에 추가할 수 있는 코드를 확인 할 수 있습니다.

 

다음과 같이 pom.xml에 추가합니다.

		<!-- Spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
        
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.13</version>
			<scope>test</scope>
		</dependency>        

 

다음과 같이 메이븐 디펜던시에 추가된 것을 확인할 수 있습니다.

반응형

2. 이클립스 Build Path에 JUnit 라이브러리 추가

 

다음과 같이 JUnit을 사용하려는 프로젝트를 선택 후 마우스 오른쪽 클릭 -> Build Path -> Configure Build Path 를 선택합니다.

 

 

Libraries 탭에서 Add Library를 클릭합니다.

 

JUnit을 선택하고 Next를 클릭합니다.

 

JUnit 4를 선택 후 Finish를 클릭합니다.

 

JUnit 4 라이브러리가 추가된 것을 확인할 수 있습니다. Apply and Close를 클릭합니다.

 

JUnit으로 테스트할 수 있는 환경이 구성되었습니다.

 

 

DB에 접속이 잘 되는지로 JUnit 테스트를 해보겠습니다.

 

프로젝트를 선택 후 New -> JUnit Test Case를 클릭합니다.

 

원하는 파일명을 입력합니다.

파일명을 입력 후 Finish를 누르면 src/test/java에 파일이 생성됩니다.

 

새로 생성된 파일에 다음 코드를 입력합니다.

import javax.sql.DataSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"file:src/main/webapp/WEB-INF/spring/root-context.xml"})
public class springDatasourceTest {

    @Autowired
    private ApplicationContext context;
    
	@Test
	public void test() {
		DataSource ds = (DataSource) context.getBean("dataSource");
		
		try {
			System.out.println(ds.getConnection());
		} catch(Exception e){
			//예외 발생 시 처리부분

		}
	}
}

JDBC 설정이 필요하시면 다음 링크를 참조하세요.

2020/12/11 - [프로그래밍/Spring Framework] - [JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

 

[JDBC] Spring Maven 프로젝트에 MS-SQL Server 2019 JDBC Driver 설정 방법

이번 포스팅에서는 Spring Maven 프로젝트를 생성 후 MS-SQL과 연결하는 과정을 설명드리겠습니다. MS SQL Server 2019 JDBC Driver 정보가 있는 다음 사이트에 접속합니다. docs.microsoft.com/en-us/sql/connec..

grand-unified-engine.tistory.com

<Ctrl> + <F11>을 눌러 build를 하면 Console창에 다음과 같이 ConnectionId가 출력됩니다.

 

지금까지 Spring Framework에 JUnit 설정하는 방법에 대해 알아보았습니다.

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 웹페이지에 JSON 형태로 반환되는 데이터를 크롤링 해보도록 하겠습니다.

 

예제 페이지로 네이버 금융 해외증시를 살펴보겠습니다.

 

해외증시에서 S&P 500을 클릭합니다.

일별 시세에서 마우스 오른쪽 클릭해서 '검사'를 누르거나 Ctrl + Shift + C를 눌러 검사 창을 띄웁니다.

 

일별 시세에서 다른 페이지를 눌러 보겠습니다. 그런데 페이지를 바꿔도 URL 주소가 변경되지 않습니다.

 

왜 그런지 살펴보기 위해 검사 창에 Network 탭에 들어가 봅니다.

 

페이지를 누를 때마다 새로운 URL주소가 생깁니다. 

 

다음과 같이 주소를 선택한 후 마우스 오른쪽 클릭해서 Copy -> Copy link address를 클릭합니다.

 

 

finance.naver.com/world/worldDayListJson.nhn?symbol=SPI@SPX&fdtc=0&page=2
복사한 URL을 살펴보니 worldDayListJson을 호출하고 있습니다.

 

이 주소를 브라우저 창에 넣고 접속 해보도록 하겠습니다.

다음과 같이 JSON 형태의 데이터로 반환하고 있음을 알 수 있습니다.


파이썬에서 json 데이터를 크롤링 하는 코드를 작성해보겠습니다.

 

import pandas as pd
from urllib.request import urlopen
import json

symbol = 'SPI@SPX'
page = 1
url = 'https://finance.naver.com/world/worldDayListJson.nhn?symbol=' + symbol + '&fdtc=0&page=' + str(page)
httpResponse = urlopen(url)
jsondata = json.load(httpResponse)
jsondata

위 코드를 실행하면 json 형태로 데이터를 반환합니다.

 

 

728x90
반응형
728x90
반응형

이번 포스팅에서는 Spring Maven 프로젝트를 생성 후 MS-SQL과 연결하는 과정을 설명드리겠습니다.

 

MS SQL Server 2019 JDBC Driver 정보가 있는 다음 사이트에 접속합니다.

 

docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15

 

Download Microsoft JDBC Driver for SQL Server - SQL Server

Download the Microsoft JDBC Driver for SQL Server to develop Java applications that connect to SQL Server and Azure SQL Database.

docs.microsoft.com

다음 파일을 다운받아 라이브러리를 직접 세팅하셔도 됩니다.

 

 

이번 포스팅에서는 pom.xml에 설정하는 방식으로 진행하겠습니다.

 

스크롤을 내려보면 다음과 같이 pom.xml에 설정하는 방법이 나와 있습니다.

 

copy를 클릭합니다.

 

붙여넣기를 할 때 jdk 버전이 11이 아니라면 위 xml 정보에서 jre11을 환경에 맞게 수정해야 합니다.

예를 들어 jdk가 1.8이라면 jre8로 수정해주시기 바랍니다.

 

pom.xml에 붙여넣기 하고 저장 버튼을 클릭하면 해당 프로젝트의 Maven Dependencies에 MS SQL JDBC가 포함된 것을 확인할 수 있습니다.

반응형

 

properties파일에 데이터베이스 접속 정보를, context.xml에 dataSource Bean을 등록 후 DB에 접속할 수 있는 환경을 세팅해보도록 하겠습니다.

 

src/main/resources에 config 폴더를 생성하고 db.properties파일을 만듭니다.

해당 파일에 다음과 같이 입력합니다.

jdbc.driverClassName = com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url = jdbc:sqlserver://주소;databaseName=데이터베이스명
jdbc.user = 계정id
jdbc.password = password

 

이 정보를 dataSource Bean에 매핑하는 작업을 하도록 하겠습니다.

context.xml을 따로 만드시거나 tomcat 실행과 함께 로딩되는 WEB-INF/spring/root-context.xml에 작성하면 됩니다.

<beans> 루트 엘리먼트 안에 다음을 입력합니다.

	
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/db.properties</value> 
            </list>
        </property>
    </bean>	
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

 

PropertyPlaceholderConfigurer class에는 properties 파일의 위치를 설정합니다.

DriverManagerDataSource class에는 properties 파일에 있는 설정 값을 property로 등록하여 Spring에서 jdbc 설정 값으로 사용할 수 있게 합니다.

 

그런데 DriverManagerDataSource class에 빨간색으로 표시되면서 읽을 수 없다고 나오는 경우가 있습니다.

 

DriverManagerDataSource를 사용하기 위하여 pom.xml에 다음을 입력해 spring-jdbc.jar를 Maven Dependencies로 등록해야 합니다.

		<!-- Spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

 

다음과 같이 빨간 줄이 사라진 것을 확인 할 수 있습니다.

 

 

Spring에서 MS-SQL DB에 접속할 수 있게 환경 설정을 마쳤습니다.

728x90
반응형

+ Recent posts