본문 바로가기

프로그래밍13

JDBC + MSSQL 조합 사용시 주의사항 JDBC + MSSQL 조합 사용시 주의사항 최근 Spring과 MSSQL 조합으로 사용시 SELECT시 CPU 사용량이 지속적으로 증가하는 문제를 겪었었다. 원인 JDBC의 MSSQL드라이버를 사용할 시 sendStringParametersAsUnicode옵션이 기본으로 true로 설정되어 있다. 해당 옵션은 모든 String 자료형을 nvarchar로 쿼리 실행에 전달하는데 varchar컬럼 검색시 형변환이 일어나면서 CPU가 마구 치솟는게 문제였다. (@P0 nvarchar(4000)) select * from example where example_varchar=@P0 해당 예제 쿼리처럼 example_varchar는 varchar컬럼인데도 불구하고 nvarchar로 검색을 시도한다. 해결 방법 .. 2022. 8. 5.
[토비의 스프링 5장] 서비스 추상화 5장 서비스 추상화 자바엔 표준 스펙/사용 제품/오픈소스를 통틀어서 사용 방법과 형식은 다르지만 기능과 목적이 유사한 기술이 존재한다. 환경과 상황에 따라서 기술이 바뀌고, 그에 따라 다른 API를 사용하고 다른 스타일의 접근 방법을 따라야 한다는 건 매우 피곤한 일이다. 트랜잭션 서비스 추상화 임의로 예외를 어떻게 발생시킬까? 정기 사용자 레벨 관리 작업을 수행하는 도중에 네트워크가 끊기거나 서버에 장애가 생겨서 작업을 완료할 수 없다면, 그때까지 변경된 사용자 레벨은 모두 되돌려 놓고, 유저들에게 알려야한다. 이런 상황의 테스트를 진행할 때는 어떤 방법이 있을까? 코드 자체를 수정한다. 테스트를 위해서 코드를 수정하는것은 매우 좋지 못한 방법이다. 때문에 해당 방법은 사용하지 않겠다. 상속을 통해서 .. 2022. 6. 13.
[토비의 스프링 4장] 예외 4장 예외 잘못된 예외처리 습관의 위험성 예외가 발생했는데 catch 블록을 써서 잡아내는 것까지는 좋으나 이후 아무 조치도 취하지 않고 넘어간다면 정말 위험한 일이다. 원치 않는 예외가 발생하는 것보다도 훨씬 더 나쁜 일이다. 프로그램 실행 중 어디선가 오류가 있어서 예외가 발생했는데 그것을 무시하고 계속 진행한다는 걸 의미하기 때문이다. 결국 발생한 예외로 인해 어떤 기능이 비정상적으로 동작하거나, 메모리나 리소스가 소진되어 예상치 못한 다른 문제를 일으킬 것이다. 최종적으로 오작동을 하거나 시스템 오류가 나서 운영자가 알아차렸을 때는 이미 조치를 취하기엔 너무 늦었다. 초난감 예외처리 try { ... } catch (SQLException e) { // 예외를 잡고는 아무것도 하지않는다. } tr.. 2022. 6. 10.
[토비의 스프링 3장] 템플릿 3장 템플릿 템플릿이란 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴을 유지되는 특성을 가진 부분을 자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. 예외처리 기능을 갖춘 DAO public void deleteAll() throws SQLException { Connection c = dataSource.getConnection(); PreparedStatement ps = c.prepareStatement("DELETE FROM users WHERE 1=1"); ps.close(); c.close(); ... DBO 객체 내의 ReparedStatement를 처리하는 중 오류가 발생하면 Connection 반환이 정상적으로 이.. 2022. 6. 9.
[토비의 스프링 2장] 테스트 2장 테스트 스프링의 핵심 가치 스프링이 개발자에게 제공하는 가장 중요한 가치는 객체지향과 테스트다. 스프링으로 개발을 하면서 테스트를 만들지 않는다면 이는 스프링이 지는 가치의 절반을 포기하는 셈이다. 테스트의 유용성 코드만 만들어놓고 잘 돌아가겠거니 하고 무책임하게 개발을 마치려는 개발자는 아마 없을 것이다. 테스트랑 결국 내가 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서, 만든 코드를 확신할 수 있게 해주는 작업이다. 테스트의 결과가 제대로 나오지 않는 경우에는 코드나 설계에 결함이 있음을 알 수 있다. 결국 최종적으로 테스트가 성공하면 모든 결함이 제거됐다는 확신을 얻을 수 있다. UserDaoTest의 특징 public class UserDaoTest { public static .. 2022. 6. 8.
[토비의 스프링 1장] 오브젝트와 의존관계 1장 오브젝트와 의존관계 스프링이 추구하고자 하는 가치 유연함 -자바의 잃어버린 객체지향 언어적 장점을 다시 살릴 수 있도록 도와주는 도구 단순함 - 뛰어난 확장성으로 다른 많은 프레임워크 등과 쉽게 결합하여 사용할 수 있도록 할 것 OOP의 장점을 최대한 살린 것이 스프링이고, 이것을 기반으로한 접근 방법을 사용하면 스프링이 추구하던 아키텍처, 설계의 근간이 흔들릴 일 없이 확장되어 결국은 확장된 코드마저도 스프링과 같이 확장성이 뛰어나고 유지보수가 쉬운 코드가 될 수 있다. 객체지향의 원칙 객체지향의 5원칙 SRP(Single Reponsibility Principle) : 단일 책임 원칙 하나의 클래스는 하나의 책임만을 가져야 한다. OCP(Open Closed Principle) : 개방-폐쇄 원.. 2022. 5. 10.
Java의 final을 안전하게 사용하는 방법 Java의 final 예약문은 조심해서 사용하자 최근 진행하고 있는 스터디에서 봤던 책의 문구 중 한 소절에 물음표를 띄우는것부터 해당 문제가 시작되었다. 다만 내부 클래스에서 외부의 변수를 사용할 때 외부 변수는 반드시 final로 선언해 줘야 한다. // 문제의 코드 public void add(final User user) throws SQLException { class AddStatement implements StatementStrategy { ... } StatementStrategy st = new AddStatement(); jdbcContextWithStatementStrategy(st); } 왜 파라미터로 객체를 받을때 final로 받아야 하는가? 나는 해당 책에서 final로 파라미.. 2022. 4. 22.
sequelize.js left join/is null과 limit 사용시의 문제 sequelize.js left join/is null과 limit 사용시의 문제 최근 sequelize를 통한 ORM으로 DB를 다루는 중 불편한 문제점이 생겼다. 평소에는 일반 쿼리를 이용해 left join/is null을 통해서 결과값을 구하던 행위가 sequelize에서는 안되던것. 이유는 실로 간단했는데, 시퀄라이즈에서 limit과 join(include)를 사용시 기본적으로 limit은 서브쿼리로 취급되게 된다. 아무리 찾아봐도 이 문제를 해결할 방법이 없었는데, 결국 서브쿼리를 이용하는 방식으로 변경하여 동일한 결과값을 가져오게 되었다. Problem 문제의 시퀄라이즈 코드는 아래와같았다. const getItem = async () => { try { const items = await .. 2021. 8. 27.
Go언어를 이용한 한글의 결합 한글 문자의 초정, 중성, 종성 결합 지난글에서는 한글의 자모음 분리를 다뤘다. 그리고 거기서 얻게된 분리의 노하우를 통해서 이번에 그반대인 결합에 대해서 알아볼까 한다.(원래 조립은 분리의 역순이다...) 개요 이전 게시글과 마찬가지로 해당 기능또한 라이브러리를 통해서 이용이 가능하다. 긴 글을 만드는게 싫기때문에 우선 본론부터 바로 말하고자 한다. 분리에 대해서 이전 글을 통해서 한글 문자의 구성은 초성, 중성, 종성으로 구성된다는것을 알았다. 그리고 한글문자의 시작과 끝인 [가-핳]을 알게되었다. 최종적으로 무엇보다 중요한 각 부분에 맞는 분리 법칙에 대해서 다뤄보았다. 조립은 분해의 역순 그렇다면 결국 원리는 동일하다. 조립은 분해의 역순이라고 말하듯 해당 식을 토대로 재결합을 구성할 수 있다. .. 2020. 9. 8.
Go configration 불러오기 Golang으로 설정파일 불러오기 Go언어로 Config를 불러오는 2가지 방법을 소개한다. Yaml 파일 불러오기 많은 프로젝트에서 설정파일로 손꼽히는 yaml이다. 우선 yaml은 Go의 공식라이브러리엔 존재하지 않는다. 때문에 해당 라이브러리를 받아야만 사용이 가능하다. addr: 127.0.0.1 port: 3306 user: root pass: password// YAML struct type Config struct { Addr string `yarm: "addr"` Port int `yarm: "port"` User string `yarm: "user"` Pass string `yarm: "pass"` } func LoadConfigration(path string) Config { var .. 2020. 7. 9.
Go언어를 사용한 자모음 분리 Golang 자모음 분리 분리 코드와 각종 참조는 해당 블로그에서 발최하였습니다. 서론 한글의 자모음의 분리가 필요한 일이 있어 구글신의 힘을 빌어보고 있었다. 여러 가지 언어로 포팅된 포스트를 보았고, 이를 포팅할 생각이었다. 하지만 만드는 김에 결합 기능까지 추가해서 직접 만들어보기로 하였다. 굳이 긴 글을 읽을 필요 없이 필자의 Github 저장소에 해당 소스가 있어 바로 가져다 쓸 수 있다. 초성, 중성, 종성의 분리 한글은 초성, 중성, 종성으로 구분이 되어있다. 각각 초성 19개, 중성 21개, 종성 28개로 구성되어있다. 이를 배열에 담아보자면 아래와 같은 형태가 된다. var ( hangulCHO = []string{"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", ".. 2020. 7. 7.
Golang 정규식을 통한 특수문자 제거 방법 1 모든 문자없이 오직 한글만 필요한 경우에 해당하는 방법이다. 한글의 자음은 ㄱ-ㅎ, 모음은 ㅏ-ㅣ, 그리고 모든 폰트는 가-힣 까지 존재한다. re := regexp.MustCompile(`[ㄱ-ㅎㅏ-ㅣ가-힣]+`) key := re.ReplaceAllString("ㄱ-ㅏ*가/각", "") output : ㄱㅏ가각 해당 방법은 한글뿐만 아니라 영문도 가능하기 때문에 알파벳의 시작과 끝만 알면된다. 방법 2 특수문자는 너무나도 많지만, 대다수의 특수문자를 걸러내고자 할때는 해당 방법을 사용하면 된다. re := regexp.MustCompile(`[\{\}\[\]\/?.,;:|\)*~!^\-_+@\#$%&\\\=\(\'\"\n\r]+`) key := re.ReplaceAllString("ㄱ-ㅏ*가.. 2019. 12. 13.