본문 바로가기

전체 글20

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.
[헤드퍼스트 디자인패턴 2장] 옵저버 패턴 2장 - 옵저버 패턴 옵저버 패턴이란? 옵저버패턴 클래스 다이어그램 신문사 + 구독자 = 옵저버 패턴 신문사는 주제(subject), 구독자를 옵저버(observer)라고 부른다. 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 방식으로 다대다 의존성을 정의합니다. 옵저버 패턴은 보통 주제 인터페이스와 옵저버 인터페이스가 들어있는 클래스 디자인으로 구현합니다. 옵저버로 등록하거나 탈퇴하고 싶은 경우 Subject인터페이스에 있는 메소드를 사용합니다. 옵저버가 될 가능성이 있는 객체는 Observer인터페이스를 구현해야합니다. 주제의 상태가 바뀌었을 때 호출되는 update() 메소드만 구현 옵저버에는 데이터를 보내주는 푸시(push) 방식과 옵저버가 데이터를.. 2022. 6. 15.
[헤드퍼스트 디자인패턴 1장] 전략패턴 1장 - 전략패턴 요구사항 : 오리 시뮬레이션 게임 SimUduck 오리 시뮬레이션 게임 이 게임에는 헤엄도 치고 꽥꽤 소리도 내는 다양한 오리가 등장 추후 요구사항이 변경되어 날 수 있는 기능이 추가되어야 함 또 다른 요구사항으로 소리를 내지 못하는 오리라던지, 날지 못하는 오리 등이 추가 됨 문제를 명확하게 파악하기 달라지는 부분을 찾아서 영향을 주이 않도록 캡슐화 한다. 바뀌는 부분과 그렇지 않은 부분 분리하기 해결 방법 1 : 상속(슈퍼클래스)을 통한 해결 클래스 다이어그램 요구사항이 추가되기 전 클래스 다이어그램 요구사항 변경으로 인해 추가된 클래스 다이어그램 모든 오리가 꽥꽥 소리를 내고, 헤엄칠 수 있다 생각하여 이런 특성을 모두 슈퍼클래스에서 구현 해당 슈퍼클래스를 상속받은 서브클래스들은 .. 2022. 6. 13.
[토비의 스프링 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.
[백준][10845] 큐 (파이썬) 제목 - 문제보러가기 문제 설명 큐에서 사용하는 6가지 명령어에 대한 동작을 정의하는것 (push, pop, size, empty, front, back) 입력 15 push 1 push 2 front back size empty pop pop pop size empty pop push 3 empty front출력 1 2 2 0 1 2 -1 0 1 -1 0 3풀이 큐의 6가지 동작을 만들어주는 단순한 문제다. 큐 구조체의 특징(FIFO)를 알고있으면 손쉽게 만들 수 있다. 다만 input()을 이용하면 시간초과가 나오는 문제다. sys라이브러리를 활용해주면 시간초과없이 성공적으로 해결할 수 있다. 코드 import sys stack = [] for _ in range(int(sys.stdin.readli.. 2020. 12. 30.
Go언어를 이용한 한글의 결합 한글 문자의 초정, 중성, 종성 결합 지난글에서는 한글의 자모음 분리를 다뤘다. 그리고 거기서 얻게된 분리의 노하우를 통해서 이번에 그반대인 결합에 대해서 알아볼까 한다.(원래 조립은 분리의 역순이다...) 개요 이전 게시글과 마찬가지로 해당 기능또한 라이브러리를 통해서 이용이 가능하다. 긴 글을 만드는게 싫기때문에 우선 본론부터 바로 말하고자 한다. 분리에 대해서 이전 글을 통해서 한글 문자의 구성은 초성, 중성, 종성으로 구성된다는것을 알았다. 그리고 한글문자의 시작과 끝인 [가-핳]을 알게되었다. 최종적으로 무엇보다 중요한 각 부분에 맞는 분리 법칙에 대해서 다뤄보았다. 조립은 분해의 역순 그렇다면 결국 원리는 동일하다. 조립은 분해의 역순이라고 말하듯 해당 식을 토대로 재결합을 구성할 수 있다. .. 2020. 9. 8.