본문 바로가기

개발171

일을 시킬때는 권한을 함께 주어야 한다. 일을 시킬때는 권한을 함께 주어야 한다. 당연한 말처럼 들리지만 그렇지 않은 경우가 더 많다. 그 일의 결과에 대한 책임만 주어질 뿐, 그 일을 하는데 필요한 권한은 주지 않는다. 얼마 전 일이다. 현재 개발하고 있는 프로그램에 타 시스템과 연동해야 할 일이 생겼다. 해당 시스템은 기존에 사용해 오던 것이고, 담당자도 있다. 하지만 프로젝트 PM은 업무 담당자에게 시켜야 할 관리 업무를 내게 시키고 있었다. 그것도 퇴근 시간이 지난 시점에 해당 업체에 전화를 하라면서 독촉을 하고 있었다. 난 끝까지 전화를 하지 않았고, 해야할 내용에 대해 문자만 보냈다. 심지어 내게 시킨 그 관리 업무는 내게 어떤 정보나 권한도 없었다. 연동될 시스템에 대한 로그인 정보도, 해당 시스템의 IP 정보도, 원격을 열어 줄 .. 2023. 5. 23.
코드 리뷰가 필요하다 오늘 절실하게 코드 리뷰가 필요하다는 생각이 들었다. 또한 분석/설계 관련 문서와 정보 공유의 필요성과 해당 도구들에 대한 필요성도 절실히 느낀 하루이다. 사건의 발단은 다른 개발자의 미완성 프로그램을 받으면서 부터 시작했다. 솔루션에는 네이밍룰과 공식적으로 존재하는 문서는 없지만 다들 준수하고 따르는 개발 기준이 있다. 이걸 무시하고 본인이 하고 싶은데로 개발을 하다가 계약기간이 끝났다고 가버렸다. 개발 기준에 따라 흘러야할 비즈니스 로직이 엉뚱한 클래스를 참조 하고 있고 화면에는 나오는 데이터가 어디를 뒤져봐도 불러오는 곳이 없었다. 클래스는 임의로 지정해 화면에서 호출해 버렸고 나오는 데이터는 포멧으로 눈 속임을 해놨다. 참으로 어처구니 없고 당황 스럽다. 다음 사람을 위해 어떤 테이블을을 참조하면.. 2023. 4. 17.
[JAVA] Util 클래스에서 세션 사용하기 직무에 따른 권한을 설정하기 위해 새로운 권한 설정 룰을 만들어야 할 상황이 발생했다. 일단 방향은 세션을 이용하되 직무에 따른 권한을 체크하기 위한 Util 클래스를 하나 신규를 생성하기로 했다. 문제는 util 클래스와 같은 contoller 이외의 클래스에서 세션값에 접근 할 수 있어야 한다는 것이다. 권한 체크 함수에 세션값을 넘기면 좋기는 하겠지만 controller 이외의 클래스에스 세션값을 확인 하기도 어렵기도 하지만 일일이 세션값을 확인해서 넘기는 작업은 번거롭고, 간편하지도 않으며, 그다지 좋아 보이지 않는다. (값을 확인 할 수 있으면 그 자리에서 처리하는게 낫지 않을까?) 이때 사용할 수 있는 방법이 RequestContextHolder와 ServletRequestAttributes를.. 2021. 8. 2.
[DB] 한 컬럼에 여러개의 결과 표현하기 쿼리 결과가 여러 줄인 데이터가 있다. 그런데 그중 한 컬럼의 내용반 다르고, 다른 컬럼의 결과는 똑같다. 그래서 내용이 다른 그 한 컬럼의 내용을 한 번에 받고 싶다. 이럴때 사용 할 수 있는 방법이 - oracle : LISTAGG(컬럼명 구분자) - mysql : GROUP_CONCAT(컬럼명 SEPARATOR 구분자) 함수를 이용하는 것이다. 두 함수 모두 지정 가능한 문자, 기호 등을 구분자로 하여 여려 행의 내용을 한 컬럼에 표기해 준다. oracle SELECT USER_ID, LISTAGG(USER_TASK, ',') WITHIN GROUP (ORDER BY USER_ID) AS USER_TASK FROM USER_TASK WHERE .... GROUP BY USER_ID 묶어야할 대상은 .. 2021. 7. 28.
[DB] WITH AS 문 사용하기 쿼리를 작성할때 과도한 서브 쿼리는 메인 쿼리의 더욱 복작하게 만든다. 이럴때 WITH AS 구문을 사용하면 그나마 복잡한 부분의 쿼리를 분리해 낼 수 있을 뿐만 아니라 반복적으로 쓰이는 서브 쿼리라면 성능의 향상을 덤으로 얻을 수 있다. 방법은 간단하다. 메인 쿼리 위에 WITH AS 구문을 사용해 서브 쿼리를 옮겨 놓는 것이다. WITH 이름 AS ( SELECT ... FROM ... WHERE ... ) SELECT .... FROM 이름 WHERE .... 서브쿼리가 여러개라 하더라도 걱정할 필요 없다. 각 서브쿼리를 , 로 구분하여 추가해 주면 된다. WITH 이름1 AS ( SELECT 문 ), 이름2 AS ( SELECT 문 ) SELECT ... FROM 이름1 LEFT OUTER JOI.. 2021. 7. 28.
[JAVA] 문자열에서 숫자만 남기고 제거하기 (replaceAll) 지난번과 비슷한 일이 벌어졌다. 이번에는 날짜형식으로 된 8자리 데이터를 보내와야 하는데 싹다 무시하고 '0000-00-00' 형식으로 데이터가 날아왔다. 지난번에 작성한 특정 문자열을 제거하는 것으로는 해결이 되지 않는 문제다. 사실 지난번 문제보다 더 간단하다. 숫자만 빼고 모든 문자를 없애버리면 되기 때문이다. 따라서 문자열 메서드 중 replaceAll 을 사용하면 된다. 데이터가 '0000-00-00' 식으로 날아 왔기 때문에 단순히 str.replaceAll("-",""); str.replaceAll("-",""); 식으로 처리해 줘도 되겠지만 또 어떤 형식으로 날아 올지 알 수 없기 때문에 숫자 이외의 문자는 모두 제거 하기로 한다. 따라서 이번에도 정규식을 사용하기로 한다. str.repl.. 2021. 6. 16.
[JAVA] 문자열에 특정 문자가 있는지 확인(matches 이용하기) 다른 기관과 연계 업무를 하던 중 타 기관에서 보내온 파일에 문제가 있어 잘 동작하던 배치에 문제가 생겼다. 정확히 배치 자체의 문제라기 보다는 애초에 서로 약속된 레이아웃으로 데이터를 보내주지 않은 타기관의 문제이었지만 그 레이아웃 정의서만 믿고 예외 상황을 처리하지 않은 배치도 문제라면 문제다. 문제는 간단했다. 원래 '횟수' 로 넘어와야 할 데이터에 숫자 이외의 문자가 끼어 들었다는 것이다. '횟수'라는 이름에서 알 수 있듯이 해당 데이터는 숫자로만 구성된 문자열이다. 따라서 숫자 이외에 문자가 들어 있다면 예외를 발생시키거나 다른 동작을 시켜 주면 된다. 타기관에서 넘어오는 데이터는 텍스트 파일로 되어 있어 읽어 들이는 모든 데이터는 String 타입이다. String 에서 써먹을 수 있는 방법은.. 2021. 6. 9.
[JAVA] 한글이 포함된 문자열 자르기 java 에서 문자열을 자를때 일반적으로 subString 을 사용하는데 알아 두워야 할 점은 subString로는 한글 문자열을 자를 수 없다는 것이다. 정확히는 1바이트만 구성된 문자들(숫자, 영문자 등)의 문자열만 자를 수 있다고 보는게 맞다. 그럼 한글은 어떻게 자르나? 원리는 간단하다. 문자열을 바이트형으로 변환한 뒤 각 글자의 길이를 계산하여 처리하면 되는 것이다. 한글은 2바이트 문자이므로 문자열을 하나하나 반복하다가 해당 문자열이 1바이트 문자인지 2바이트 문자인지 확인 후 잘라 주는 것이다. 이때 주의할 점이라면 자르고자 하는 위치가 2바이트 문자열에 위치해 있다면 1바이트 앞으로 끊어서 읽어주면 된다. 간단한 내용이니 코드를 바로 보자. private String subStrBytes(.. 2021. 5. 13.
DB2 에러 정리 SQLCODE : 104 SQLSTATE : 42601 문법이 올바르지 않을 경우 발생 SQLCODE : 204 SQLSTATE: 42704 테이블이 없을때 SQLCODE : 206 SQLSTATE : 42703 컬럼이 존재하지 않을때 SQLCODE : 302 SQLSTATE : 22001 컬럼 사이즈가 문자열의 길이 보다 작을때... SELECT 에서 발생하는 경우가 있다. 특히 ORDER BY 를 조회 할때 페이지 사이즈가 작기 때문에 발생하는 경우가 있는데 (ORDER BY를 생략해 주면 에러가 안난다.) 이럴때 페이즈 사이즈를 늘려 주거나, 읽어 오는 데이터의 길이를 제한해야 한다. SQLCODE : 405 SQLSTATE : 42820 숫자 상수가 너무 길거나, 그 값이 해당 데이터 유형의 범위.. 2021. 4. 16.
Spring Security 적용 후 이유없이 Access Denied 될때 Spring Security 를 적용하고나서 이전에 잘 되던 페이지들이 이유없이 Access Denied 되는 경우가 있다. 특히 무엇인가를 입력하는 화면에서 이런 현상이 발생 했다면 아래의 코드를 입력해 보자 이 코드로 문제가 해결 되었다면 원인은 Spring Security 의 CSRF 설정 때문이다. Spring Security 4.0에서 CSRF 설정이 기본적으로 true로 설정되기 때문이다. 2021. 1. 30.
[SQL] 각 데이터베이스 별 like 검색 시 문자열 조합 방법 mysql(mariadb)나 oracle 등 각 데이터베이스 제품 별로 like 검색 시 문자열을 조합하는 방법에 약간의 차이가 있다. mysql(mariadb) code like CONCAT('문자열','문자열',....) ex ) code like CONCAT(#{code}, '%') code like CONCAT('%', #{code}, '%') oracle, db2 code like '문자열' || '문자열'.... ex) code like #{code} || '%' code like '%' || #{code} || '%' mssql code like '문자열' + '문자열'... ex) code like #{code} + '%' code like '%' + #{code} + '%' 2020. 12. 16.
Spring Security 와 CSRF 설정 Spring Security 4.0 부터는 CSRF 설정이 기본으로 true 이다. 이에 따른 유의사항이 있는데 기본적으로 통신시 CSRF 토큰값은 POST방식으로 데이터를 서버에 전송할때 반드시 필요하다. GET 방식일 때는 필요 없다. 최근에 서버와 클라이언트 간의 통신 방법으로 Restful 방식을 많이 사용하는데 게시물 목록 같은 것을 조회 하는 데도 type을 POST로 설정하는 경우가 많다. 최근에 jsp에서 ajax를 써서 Restful 방식의 게시판을 구현하였는데 Spring Security 를 적용하면서 문제가 발생했다. 게시물을 읽어오는 restful 의 type을 post로 설정하면서 발생한 문제였다. 이 방식이 안되는것은 아니지만, 추천할 만한 방식은 아니다. POST 방식은 Spr.. 2020. 12. 14.