일상/🏢 2022-23 실무경험

[4주차] 여의도 증권사 실무

letzgorats 2023. 1. 9. 10:15

01.09 (월)

- 저번 주말에 아르바이트를 뛰려고 했지만, 몸이 안 좋아서 집에서 쉬었다. 열은 다 내리고 몸살도 없어져서 감기가 거의 다 나아가고 있지만, 아직 기침은 계속 하고 있다. 그래도 이제 서서히 몸이 좋아지면 올해 다시 운동을 시작해보려고 한다. 30살까지 몸짱이 되기 위해서 부단히 노력할거다. 많이 먹어야하는데 ㅠ  어제 카카오톡으로 선물받은 음료 등을 환불받아서 이번주 점심값은 그걸로 해결하면 될 듯 하다.

- 아침에는 저번주 금요일날 작업했던 "MTS 페이지의 디폴트옵션 현금성 자산 유지 신청 등록" 페이지를 마무리하였다. 처리한 결과를 해시 맵에 담을 때, 중복되는 키 값들을 제거하고 본래의 paramMap과 OriginalMap에 있는 키 값들도 추가해줬다. 하나의 맵에 원하는 결과를 담는 작업을 마치고 사수인 진교형한테 말을 하니 다른 것을 조금 하고 있으라고 하셨다. 연초라서 많이 바쁘다고 하신다. 그래서 이렇게 블로그 글도 미리미리 쓸 수 있어서 오히려 좋다 ㅎ

- 점심은 역시 구내식당에서 해결을 했고 오늘은 낮잠을 안자고 오후업무에 돌입했다. 오후에는 MTS에서의 매수, 교체매매, 상품조회와 관련한 쿼리문에 매수가능여부를 뜻하는 칼럼을 추가하는 업무를 진행했고, MTS 페이지에 "디폴트옵션 상품취소조회"와 "디폴트옵션 상품취소등록" 페이지와 관련한 Svc, Dao, jsp 파일을 또 만들었다.

- 17시 30분이 지나니까 영업시간 로그로 빠져나가서 나머지는 내일 오전에 하기로 하고 퇴근했다!

1️⃣ JAVA에서 HashMap에서 키-값(Key-Value) 가져오기
- 주로 스프링에서 RestAPI 의 결과값으로 받아올 때에 Map 형태나 List 맵형태로 반환을 한다. HashMap은
(key-value)의 형태로 데이터를 저장하는 객체이다. 값은 중복될 수 있지만, 키 값은 중복되지 않아 이미 존재하는 key값에 동일한 key를 put하게 되면 기존의 데이터는 새로 put한 값으로 대체된다.

(ex)
Map<String, Integer> classMap = new HashMap<String, Integer>(); 이라 하면,
KEY VALUE
아스날 1
맨시티 2
맨유 3

- KEY들을 가져오는 경우

System.out.println(classMap.keySet());

[아스날, 맨시티, 맨유]

- VALUE들을 가져오는 경우

System.out.println(classMap.values());

[1, 2, 3]

- Key 값을 각각 출력하는 방법

// iterator() 이용하는 방법
Iterator<String> iter = classMap.keySet().iterator();
while(iter.hasNext()) {
	String key = iter.next();
    System.out.print(key + ", ");
}

// 아스날, 맨시티, 맨유


// keySet()을 이용한 for문
for (String key : classMap.keySet()) {
	System.out.print(key + ", ");
}

// 아스날, 맨시티, 맨유


// Entry 이용하는 방법
Set set = classMap.entrySet();
Iterator iter2 = set.iterator();
while (iter2.hasNext()) {
	Entry<String, Integer> entry = (Entry)iter2.next();
    System.out.print((String)entry.getKey() + "는 " + (Integer)entry.getValue() + "위, ");
}

// 아스날은 1위, 맨시티는 2위, 맨유는 3위

 

맵 형태인 OrigianlMap에 담긴 객체들 중에 해시맵 형태 말고 리스트가 있는데, 그 리스트 안에 다시 해시맵 형태가 들어있었다. 그 리스트안의 해시맵을 뽑아낸다음에, ResultListMap으로 치환하고, ResultMap은 해시맵 형태이니까 각 Key, Value를 추적하면서 result 맵에 추가할 것은 추가하고 버릴것은 버렸다.
Map result = (Map) svc.doService(subMap);
Map<String, String> ResulListMap = new HashMap<String,String>();
ResultMap.putAll(list.get(0));
...
...
Set set = ResultMap.entrySet();
Iterator iter2 = set.iterator();
while(iter2.hashNext()){
	Entry<String, String> entry = (Entry)iter2.next();
	// doService를 끝낸 result 맵이 originalMap에 있는 key를 가지고 있지 않다면 추가
	if (!result.containsKey((String)entry.getKey())){
    	result.put(entry.getKey(), entry.getKey());
    }
}

 

 


01.10 (화)

- 요즘에는 자기전에 내일 입고갈 옷을 미리 정리해놓으니까 출근준비시간이 줄었다. 속옷부터 겉옷까지 준비하고 자니까 샤워하고 나와서 바로바로 챙겨입을 수 있어서 시간이 단축되는 것 같다. 앞으로 이러한 준비성을 습관화해야겠다.

- 아침에는 IT부서의 한 분께서 결혼을 하신다고 IT부서의 모든 팀에게 커피를 쏘셨다. 엄청 젊으신 여성사원분이신 것 같은데, 요즘 주위에 결혼하는 젊은 사람들이 왜 늘고 있는 것 같은지 모르겠다! 마침, 우리 팀 차장님과 부장님과 진교형은 회의에 들어가셔서 책상에 우리 팀 커피를 챙겨서 놓아드렸다.  

- 오전에는 어제 진행하던 업무를 하려고 했는데, 급하게 내부 개발자와 협업을 해야 할 것이 생겨서 요청업무부터 했다.

- 디폴트옵션 매수취소와 관련한 PPT에 필요한 키값들을 정리하고 어떤 SVC의 flag값에 해당하는지 MTS 단에서 테스트 할 수 있게 소통하였다. 로그를 찍어가면서 어떤 키값인지 찾아가며 진교형한테 조언도 구해가면서 해당 업무를 완료했지만, 처음에 MTS단이 아닌 홈페이지 기준의 SVC파일을 알려드려서 다시 필요한값과 관련 SVC 파일을 알려드렸다. 그 과정에서 상품데이터를 받을 수 있는 MTS 아이디나 암호화 주민번호 등을 개발자분과 체크하면서 메시지를 주고 받았다.

- 오늘은 점심을 뭐먹을지 고민했는데, 이유는 카카오톡 선물 환불하기가 아직 완료가 안되어서 집에 있는 현금을 모아모아 4천8백원정도를 가져왔다. 그래서, 구내식당에서 해결하지 못할 것 같아 어찌할까 생각하고 있는데, 이게 무슨일인지 갑자기 월급이 들어온 것이다! 정말 힘들었는데 한숨 쉴 수 있는 기적이 일어났다. 월급날이 25일인줄 알았는데, 저번달 19일부터 일한 돈이 아마 오늘 들어온 것 같다! 정말 행운이다 ㅠㅠ 그래서 시형이한테 빌린 5만원을 바로 갚았고, 원준이한테 빌린 5천원, 밀린 2달치 휴대폰비 97870원을 바로 해결할 수 있었다. 덕분에 오늘 점심은 우리 팀과 구내식당에서 맛있게 먹을 수 있었다! 구내식당 사이드메뉴로 '크링클컷'이 나왔는데, 이것은 감자튀김이라는 것을 새로 알았다! 

- 오늘도 역시 낮잠 없이 오후업무를 바로 시작하였다. 오후에는 개발계 데이터베이스를 운영계로 다 원복시키는 작업때문에 Lock이 걸려있어서 개발하는데 일부 제한이 있었다. 제한이 안 걸리는 작업 선에서, 고칠 것은 고치고 엑셀파일 정리나 PPT 정리 등을 했다. 오후에 가입자 정보를 UPDATE 쳐서 암호화주민번호를 임시로 바꿔 MTS 개발자에게 다시 전달하였고 디폴트옵션 상품매매취소 조회, 등록 처리에 대해 다시 수정작업하였다. DB 정리 작업을 하면서 UPDATE를 하는데에 일부 제한이 걸려서 오늘은 사수인 진교형한테 궁금한 사항등을 물어보고 얘기도 좀 나눴다.

- 진교형은 3년전에 회사에 입사하셨는데, 남자치고는 일찍 사회생활을 시작하신듯 하다. 항상 느끼는 것인데, 진교형은 사회생활을 정말 잘하시는 것 같다. 옆에서 업무적인 부분 외에도 여러가지 조언들도 들으면서 사회에 대해 배우고 있는 것 같아 너무 좋다. 월급이 들어왔으니 작은 선물을 준비해야겠다. 아직까지 잔기침이 많이 나와 좀 눈치보인다. 얼른 목이 나았으면 좋겠다!

1️⃣ 테이블에서 해당 키값을 UPDATE 할 때
: MTS에서 테스트할 때 가입자마다 고유의 주민번호가 있을텐데, 이를 암호화한 값을 테이블에서 바꿔줌으로써 해당 가입자에 대한 정보를 조회, 변경할 수 있도록 해주었다.
UPDATE 테이블명
SET 암호화주민번호키값 = '세팅할 값' 으로 실행해주고 커밋해주면 된다.
WHERE 가입자번호 = '가입자번호값'

01.11 (수)

- 오늘은 늦잠을 자버렸다. 어제 늦게 퇴근하고 강아지 산책을 시켜서 그런지 오늘 아침에 일어나기가 힘들었다. 회사에 도착하고 아침인사를 드리고 자리에 앉아서 개발준비를 세팅했다. 

- 오전에는 "플랜가입자-플랜투자상품조회-플랜별디폴트옵션등록변경"에서의 개발을 진행했다. 디폴트옵션을 '예'로 변경했을 때 사용자가 선택할 수 있는 디폴트옵션상품명이 모두 다 나타날 수 있게 해주는 작업이었다. 새로운 함수를 만들고 그 안에 새로운 쿼리를 만들어야 했다. 홈페이지에서 해당 작업을 할 때 활용되는 파일과 테이블을 확인하기 위해 로그창을 보면서 어떤 파일에서 무슨 함수를 타고 어떤 테이블이 변경되는지를 찾아냈다. 하지만, 처음에 이해를 잘못한게 디폴트옵션여부를 '예'로 변경했을 때 '가입자가 선택했었던 디폴트상품명'이 뜨게 하는 줄 알고, 대체 이런 정보는 어떤 테이블에 있는지 갈피를 못 잡았다. 그래서 Dao파일에도 함수를 계속 파도타듯이 짜는 코드를 남발하다가 사수인 진교형에게 현재상황을 설명한 뒤, 이해를 다시 바로 잡았다. 디폴트옵션을 '예'로 변경하는 순간, 모든 디폴트 상품을 다 insert하면 되는 작업이었다. 그와 관련된 쿼리를 짜보면서 고민을 했다. 

- 점심은 사수인 진교형은 다른 점심약속이 있고 다른 과장님들도 바쁘셔서 혼밥을 했다. 오늘 사내식당의 두 메인메뉴는 라면과 고등어구이여서 점심을 밖에서 먹으려고 했다. 처음에는 햄버거를 먹고 싶어서 무작정 회사를 나왔지만 여의도의 점심은 정말 괴랄할 정도로 붐볐고, 그냥 여의도 건물을 쭉 구경하면서 계속 걷다가 결국 다시 회사 건물 11층으로 가서 뒤늦게 점심을 먹었다. 고등어구이와 국이 생각보다 너무 맛있어서 후회는 없었다. 

- 오늘도 낮잠을 안 자고 오후업무를 시작했다. 요즘 점심시간에는 낮잠을 안 자고 휴대폰이나 노트북을 하는 것 같다. 여튼 오후에는 오전에 할당받은 업무를 계속했는데, 디폴트옵션 적용여부를 'Y'로 변경할 때, 테이블 insert 중복을 막기 위해 맨 처음에는 for문을 이용하려고 했지만, 나중에는 기존 가입자가 가지고 있는 디폴트옵션 상품을 모두 제외(delete)하고 다시 가입자가 선택할 수 있는 모든 디폴트옵션 상품을 insert해준다면 깔끔하게 중복 insert를 방지할 수 있기 때문에 후자의 방법으로 쿼리를 짰다.

- 업무를 보다가 중간에 '가입자목록' 페이지의 디자인 지적이 프론트쪽에서 들어와서, jsp의 colgroup의 column정렬과 적절한 <br>과 텍스트 정렬등을 찾아가면서 jsp페이지를 수정했다. 이 때, colgroup의 col width의 퍼센티지가 각 tr테이블의 td 항목의 너비를 결정짓는 것 같았다.

- 다시 쿼리를 짜는 업무로 돌아와서, 고민을 하는데, Tibero로 SQL를 돌려가면서 DELETE되는 것까지는 확인을 했는데, 다시 INSERT를 하는 것에서 계속 오류가 났다. A 테이블에 데이터를 넣으려는데 B테이블의 디폴트옵션코드만 필요하다. 여기서 "INSERT INTO 테이블 A"를 하고 values가 아니라 서브쿼리를 사용해 필요한 칼럼을 SELECT 해줘야 했다. 구글링을 해가면서 하는 방법에 대해 찾아봤는데, depulicate unique key오류가 나곤했다. 종이에다가 테이블을 그려가면서 내가 이해한 로직을 사수인 진교형에게 설명하고 이렇게 하는 방식이 아닌가 하고 조언을 구했다. 

- 결국 답은 GROUP BY 였다. DISTINCT를 사용하는 것에 생각이 묶여있어 공통된 칼럼인 MEMBER_NO와 DEFAULT_OPTION_CD 칼럼을 GROUP BY로 묶을 생각을 못했다. GROUP BY 절을 추가해주니 정상적으로 INSERT문이 동작하였고, 빌드를 통해서 제대로 작업이 되는 것을 확인해 완료할 수 있었다.

 - SQL 공부에 대해서 정말 꾸준히 하면 코테도 대비될 수 있고, 실력도 오를 것 같다. 금융권은 거의 대부분 Oracle을 사용한다고 하니, Oracle을 통해서 SQL 쿼리를 공부하는 계획을 슬슬 짜봐야겠다.

- INSERT나 DELETE 등의 UPDATE를 하면, 꼭 ROLLBACK이나 COMMIT을 해줘야 다른 개발자가 테이블에 접근할 때 LOCK이 걸리는 상황을 면할 수 있다! (개발할 때 꼭 ROLLBACK 하기)
- 1️⃣DISTINCT 로 중복제거에 애를 먹으면, GROUP BY로 중복제거하는 방법도 생각해내자!
- 2️⃣SELECT 절의 컬럼과 INSERT 테이블의 칼럼이 일치하는 경우와 불일치하는 경우 혹은 SELECT 결과의 조건에 따라서 서로 다른 테이블에 INSERT 하는 방법 등 경우에 따라서 쿼리를 생각하자.

- INSERT INTO : 1개의 테이블에 1개의 행을 입력하기
- INSERT SELECT : 테이블2에서 검색한 컬럼의 데이터들을 테이블1의 컬럼에 삽입(복사+붙여넣기)
                               : 테이블의 모든 컬럼을 복사하지 않더라도, 복사될 테이블의 데이터 유형과 제약조건에 맞도록 일부 컬럼만을 선택하여 복사할 수 있다.
- INSERT ALL : INTO여러 테이블에 여러 행 입력, 다른 테이블에 동시에 같은 행 입력하기

01.12 (목)

- 오늘 아침은 딱 정시 출근을 했다. 알람을 아예 못 듣고 눈을 떴는데 오전 7시 10분이어서 진짜 제일 늦게 일어난 하루였다. 아마 어제 퇴근하고 시형이를 오래만에 만나서 상수에서 늦게까지 얘기하다가 많이 피곤했나보다. 허겁지겁 출근을 하고 오전업무에 돌입했다.

- 오늘 오전업무는 "MTS 페이지에서 디폴트옵션메뉴-디폴트옵션 매수 조회" 페이지와 SVC, Dao 파일을 생성하는 작업을 했다. 이전에 했던 디폴트옵션 상품매매취소 작업과 로직이 비슷해서 참고하니까 금방 파일을 완성할 수 있었다. 진교형이 오늘은 궁금한 거 있으면 물어보라고 여유롭다고 하셔서 궁금한걸 자주 물어봤다. 문득 개발을 하는 도중 세션체크에 대해서 궁금했다. 어떤 페이지는 아이피주소를 서버세션Id와 동일하게 입력해줘야 작동을 하는데, 어떤 페이지는 그렇게 안해줘도 작동이 됐어서 그 이유에 대해 물어봤다. 이유는 MTS관련 동작 공통모듈을 타냐 안타냐의 차이였다. 폼 액션이 mts_action이면 세션체크를 하지 않는데, mts_sec_action이라면 세션체크를 하기 위해 공통모듈 자바파일을 탄다. 세션과 관련된 공통모듈에는 세션 키값을 비교하는 코드가 있었는데, 어차피 운영계가 아니고 개발계니까 편리상 세션체크를 하지 않도록 코드로 바꿨더니, 아이피 주소를 서버세션Id로 안 바꿔줘도 모든 페이지에서 원하는 동작이 바로바로 됐다. 그래서 오늘은 세션에 대해 이해한 바를 적어볼까 한다.

더보기

유저와 서버간의 상태를 유지할 수 있는 방법중에 세션쿠키가 있다.

 

- 세션 : 특정 시간동안( 예 : 30분) 동일한 클라이언트로부터 들어온 일련의 요청정보를 의미한다.

- 쿠키 : 서버측으로부터 데이터를 클라이언트의 위치에 저장시켜놓는것을 말한다.

위의 그림과 같이 세션저장소는 서버쪽에 있다.

클라이언트가 본인의 상태를 원한다면, 서버쪽에서 데이터를 id등의 자신만의 unique한 값을 넘겨줘야한다.

그래야 서버가 어떤 클라이언트인지 구분할 수 있다.

 

이 값을 세션 키값이라고 하는데, 세션의 상태가 아닌, "세션 키 값"을 클라이언트에서 관리하기 위해서 다양한 방법이 존재한다.

세션을 찾는 과정이라고 해서 세션 트랙킹이라고도 일컫는다.

 

- 쿠키 (클라이언트쪽 브라우저 쿠키저장소에 session값을 넣어놓는다)

- hidden input (히든 인풋에 세션 아이디를 value로 주입시켜놓고 그것을 통해 요청을 받는다.)

- url re-writing (url을 세션아이디가 포함된 url로 변경시켜 보낸다.) 

사실 이런 값들은 노출안되면서 쓰는게 제일 좋으므로, 쿠키에다가 보통 놓고 쓰는것으로 알고있다.

(출처: https://jiwoochoi.tistory.com/219)

 

-- 내가 이해한바로 쉽게 얘기하자면, 사용자가 로그인을 할 때, 특정 값을 서버쪽에서 저장한다. '알루'라는 사용자가 로그인을 했다면, '알루'의 값은 1 이라고 해보자. '알루'가 로그인을 하고 어떤 메뉴를 누르더라도 서버는 항상 이 사용자의 값과 '처음 로그인'을 했을 때 저장한 사용자 정보값인 1 이 서로 같은지 체크를 하고 같다면, 같은 사용자로 인식해서 접근을 허용해준다. 사용자의 값이  클라이언트 세션 ID이고, 서버에서 초기에 저장한 값이 서버세션 ID이다. 단, 이런 세션의 유지시간은 보통 30분~1시간인데, 우리가 로그인을 한 상태로 오랫동안 방치를 하면, 세션이 끊겨 다시 로그인을 해야 하는 상황이 발생하는 이유도 이것 때문이다. --

 

- 세션의 장점
1. 서버쪽에 저장소가 있으므로, 서버쪽 로직 개발이 수월하다는 점
2. 클라이언트는 서버를 통해서만 상태를 수정할 수 있어, 클라이언트의 예측하지 못한 상태 변경에 대해 비교적 안전하다.

세션의 단점
1. 클라이언트의 데이터를 서버에서 저장하고 관리하므로 리소스가 오버헤드 될 수 있다.
2. 서버 본인의 저장소에 접근하기 위한 id는 클라이언트에 의해 접근이 가능해서 세션 역시 키값이 변조되거나, 탈취될 우려가 있다.

Java에서 세션을 통해 클라이언트와 통신하기
- 자바의 Servlet(서블릿)을 통해서 세션을 통해 통신하려고 한다면, request.getSession()을 통해 세션 객체를 받아오면 되고, request에서 세션을 얻는다고 해서, 세션은 request의 범주가 아니라 세션은 session의 범주이다.

즉, 한 세션에만 저장하는 저장소로서, request scope(한 리퀘스트단에서 공유하는 저장소)와 별도의 scope를 지원한다.
- 이 때, getSession()이라는 메소드에는 false, true 등의 파라미터를 추가로 넣을 수 있게 오버로딩이 되어있는데, 
  getSession()과 getSession(true)는 현재 세션을 가져오고, 따로 해당 클라이언트에 세션을 구성한게 없다면 세션을 새로 구성한다. getSession(false)는 세션을 가져오는데, 세션이 없다면 따로 만들지 않고 null을 반환한다는 의미이다.
- 이렇게 response를 보내면, 쿠키등의 처리를 알아서 해준다.


앞에 Session에서는 세션 키값을 쿠키에 저장한다고 했는데, 쿠키는 무엇일까?

쿠키는 이런 상태값들을 클라이언트쪽에 값을 저장하는 방식이다.

 

(1) 서버쪽에서는 쿠키라는 방식으로 브라우저에게 "상태 저장 요청"을 한다.

(2) 서버에서 쿠키의 표준에 맞게 저장요청이 들어오면, 브라우저의 실행 메모리 / 파일 시스템에 관련 쿠키 (상태) 정보를 저장한다.

(3) 브라우저에서 해당 도메인에 연결할 때 마다, HTTP 헤더에 쿠키의 데이터를 포함해서 던진다.

(https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies#%EC%BF%A0%ED%82%A4_%EB%A7%8C%EB%93%A4%EA%B8%B0)

 

HTTP 쿠키 - HTTP | MDN

HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각입니다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이

developer.mozilla.org

(모질라를 통해서 어떻게 쿠키를 통해서 브라우저와 서버가 소통할 수 있는지 자세한 사항을 알아볼 수 있다)

- 점심은 사내식당에서 장조림버터비빔밥을 진교형이랑 같이 먹었다. 12시 45분쯤에 잠깐 낮잠을 자고 1시부터 다시 오후업무를 진행했다.

- 오후에는 저번에 내가 수정한 쿼리 때문에, MTS단에서 오류가 나는 걸 발견해서 수정했다. UNION ALL 이 포함된 커리였는데, 컬럼의 개수가 달라서 나는 오류인듯 했다. 서브쿼리 단으로 안쪽부터 실행해보면서 오류가 나는 지점을 찾아갔고, UNION ALL 을 할 때는 꼭 컬럼의 개수와 타입을 맞춰야 하는 것도 숙지할 수 있었다. 오류를 수정하고, 오후에는 다시 "MTS 페이지에서 디폴트옵션메뉴-디폴트옵션 매수 조회와 등록" 작업을 진행헀다. 조회는 금방했는데, 등록이 까다로워서 애를 먹었다 ㅠ 

-  일단 내일 오늘 하고 있는 디폴트옵션 매수관련 작업을 끝내야 한다. 아마 updatecount가 0이어서 update를 안 도는데 이 이유를 찾아야 한다. (param 때문인 것 같기도 하고,,) 그라고 오류 수정요청이 또 들어왔다. 인턴 초기에 한 가입자목록에서 서브쿼리 짠 것에서 가입자가 중복해서 나타나는 현상도 해결해야 한다. 내일은 좀 빡세게 해야겠다. 이상 ,,,!


01.13 (금)

- 오늘은 인턴을 한 이후로 처음으로 우산을 들고 출근한 날이다. 우중충한 날씨 때문에 조금은 쉬고 싶지만 직장인의 시계는 그대로 흘러간다. 정시에 도착하고 오늘은 금요일이라서 오전 만담을 팀끼리 나눴다. 항상 금요일 오전은 한 사람 한 사람에게 아침밥이 나오고 9시까지 팀끼리 둥근 식탁에 앉아서 수다를 떠는 시간을 가진다. 오늘도 차장님과 두 부장님과 잔교형과 샌드위치와 커피를 먹으면서 만담을 나누었다. 오늘 얘기 주제는 눈수술 얘기가 나오다가 영화얘기, 슬램덩크 얘기, 옛날 눈 교정술 얘기, 부동산 얘기, 주말계획 등등 생각나는 이야기들을 흘러가는대로 많이 나왔다. 나도 막 먼저 이야기 하고 많이 물어보고 이야기를 주도하고 싶지만, 어른들께서 하시는 얘기를 경청하는 편에 속한다. 나도 막내답게 먼저 이야기를 꺼내는 용기를 담주에는 가져봐야겠다. 너무 수동적인 태도보다는 너무 능동적인게 나을 것 같지 않을까?

- 9시까지 이야기를 나누고, 오후 업무에 돌입했다. 어제 퇴근하기 직전에 요청들어온 오류 수정작업을 바로 진행했는데, 인턴 초기에 한 가입자목록에서 서브쿼리 짠 것에서 가입자가 중복해서 나타나는 현상이 해결해야 하는 이슈였다. 차근차근 로그를 확인하면서, 내가 수정한 부분에서 어떤 부분때문에 오류가 났는지 찾아나갔다. 예측되는 부분이 있어서 Tibero에서 로그를 붙여넣고 서브쿼리의 안쪽단부터 분석해나갔다. 

- DB가입자는 차치하고, DC와 IRP 가입자에 따른 분기조건에 서브쿼리의 정당성에 대해 고려해봤는데, IRP에만 집중했던 나머지, DC가입자를 조회했을때 중복되는 현상은 간과했었던 것이다. DC 가입자를 나타내는 PLAN_TYPE을 분기하는 코드를 자바파일에 추가하고, 그 분기문 안에 서브쿼리가 잘 들어가는지 확인했다. ORDER BY 절에 있는 칼럼 수와 SSELECT 절에 있는 칼럼 수가 일치해야 하는 주의점을 추가해주고 적절한 할당값을 준 채로 쿼리를 돌리니, 중복현상이 없어질 수 있었다. 다행히 바교적 빨리 문제를 인지, 분석, 해결해서 수정파일을 바로 넘겨주었다. 해당 업무를 완료하고, 어제 진행했던 디폴트옵션 매수 조회, 등록 페이지와 관련한 작업을 계속했다. UPDATE COUNT가 PARAM에서 빠져있는걸 확인했고 그 때문에 UPDATE COUNT만큼 for문을 돌아야하는데, 등록하는 작업을 아예 돌지 않은 것이 이유였다. 이유를 찾았으니 차차 로그를 계속 찍어보면서 오류와 씨름해나갔다. 그와 관련한 일을 하기 전에, 내가 수정했던 mts관련 파일에서 아무거나 하나를 정해 mts단에 있는 개발자에게 파일명과 입력 파라미터를 전달해 값이 제대로 오는지 확인하기 위해 회사서나톡방을 만들어 소통했다. 점심끝나고 같이 하기로 하고, 점심시간이 됐다.

- 점심은 진교형과 진교형 회사후배 사원과 사내식당에서 같이 먹었다. 역시 꿀맛이었다. 점심을 다 먹고 돌아와서는 오늘은 금요일이라 내일 회사를 오지 않기 때문에, 회사를 퇴근한 후 집에 가기전에 급구알바를 하고 집에 가려고 알바를 구했다. 다행히 오후업무가 시작되기 몇 분전에 공덕 부근에 있는 고기집에서 서빙 및 보조업무 알바를 구했다. 오랜만에 서빙한다. 올해는 생산적이게 많이 움직여야겠다. 조금이라도 움직이면 돈을 벌 수 있으니까!

- 오후에는 오전에 다른 개발자분과 얘기를 나눈 작업에 대해 서로 요청하고 피드백 받으면서 문제에 대해 분석해나갔다. 내가 수정했던 파일은 다행히 제대로 맵에 담겨 출력되는 것을 확인할 수 있었고, 한 개발자분께서 작업한 간 하나의 파일이 데이터 반환 형태가 다른 파일들과 달랐다. 서로 돌아가면서 뭐가 문제인지 수정하고 고쳐나갔다. 예전부터 꽤 오랫동안 빌드하고 고치고를 반복했는데, 해결이 안 된다고 하셔서 나도 좀 뜯어봤다. 나도 한 2시간은 만져봤는데, 문제가 해결되지 않아서, 다시 해당 개발자가 해본다고 하고, 코드를 다 원복시켰다. 

- 다시 내 업무로 돌아와서, 진교형이 영업실적 관련한 엑셀파일 jsp를 수정하라는 요청에 바로 해결하고 수정파일을 전달해 드렸다. 이제 곧 나는 공덕으로 가서 열심히 고기집 알바를 도와야겠다. 디폴트옵션 매수 등록 관련한 작업은 월요일에는 다 끝내고 싶다!

 

- 신영증권에서 일한지 이제 한달이 지났다. 시간이 빠르다. 30살때 자랑스러운 나를 맞이하기 위해 허슬하자.

반응형