일상/🏢 2022-23 실무경험

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

letzgorats 2023. 1. 31. 16:47

01.30 (월)

- 오전에는 저번에 수정했던 MTS 입금예정분매수비율이랑 디폴트옵션지정여부 가 Y,N 으로 flag값을 넣고 출력데이터에 넣어주는 작업을 했다. 이 작업은 아직 설계서가 제대로 안 나와서 밑그림만 잡는 느낌으로 작업했다. 세부 사항들은 설계사항이 나온 것에 따라 변경해야 했다.

- 입금예정분매수비율이랑 디폴트옵션지정여부가 Y, N 인지에 따라 프론트단에서 가입자가 어떤 메뉴를 누르더라도 각 액션마다 그에 맞는 팝업창이 뜨도록 해야하는 작업이었다.

- 개발계 휴대폰으로 어플을 들어갔을 때는 해당 가입자는 계좌를 만들지 않아서 계좌가 있는 가입자로 테스트를 할 필요가 있었다. 쿼리를 update쳐서 해당 계좌가 있는 가입자와 개발계 휴대폰으로 접속한 가입자를 서로 연결시켰다.

- 또, 디폴트옵션 가입이 되어 있는 가입자와 되어 있지 않은 가입자를 구별하면서 작업이 필요했다.

- 점심은 사내식당에서, 진교형이랑 제육덮밥을 먹었다. 

- 오후에는 다른 개발자분이 요청하신 TR을 드리고 그에 맞는 데이터를 넣어드렸고 홈페이지에 있는 "연금-지시" 파트에 엑셀 저장 jsp에 넣고 엑셀 jsp도 만들었다.


01.31 (화)

- 오늘은 사수인 진교형한테 자기소개서를 써본다고 미리 말씀드렸다. 오전에는 캐피탈 회사 공고에 자기소개서 작성하였는데, 7문항이나 있는데다가, 질문 자체가 좀 특이했다. 이런 문항에 대한 자기소개서도 써봐야 소스가 생기니까 결국 쓰기로 결정하고 글자를 채워나갔다.

- 점심은 사수인 진교형과 초록 대리님이 당직이라 셋이서 좀 늦게 사내식당에서 밥을 먹었다. 같은 IT부서인데 속해있는 파트는 다르지만, 초록 대리님이랑 진교형은 종종 축구도 같이 하고 친한 사이라고 하셨다. 

- 오후에도 자소서 마무리에 힘썼다. 사실 캐피탈 회사는 안 가는게 낫다고들 하지만, 자기소개서를 쓰는 것도 경험이고 자소서를 쓰면서 이런 회사에 대해서도 알 수 있는 시간이기 때문에 값지다고 생각한다.

- 자소서를 제출하고 오후에는 저번에 수정했던 MTS 입금예정분매수비율이랑 디폴트옵션지정여부 관련 작업을 다시 짜야했다. 프론트 단에 DC와 IRP 둘다 있는 가입자인 경우 하나라도 Y인지 N인지에 따라 어떻게 처리해야하는지 소통했다. 우선 Throws Exception했던 것을 주석처리하고 기존 결과만 나오도록 했고, 메시지 코드도 수정했다. 

- 다 끝나고, 어제 진교형이 시간남으면 하라고 하셨던 연금신청조회페이지에 엑셀저장 버튼 생성 업무를 진행했다. 엑셀 저장버튼을 통해 엑셀이 저장되도록 해야하는데 계속 flag값에 null 이 들어있다고 했다. action 패키지랑 jsp 페이지의 패키지가 다른데, 이것이 문제인듯한데, 원래 다른 채로 있어서 그냥 action value와 form value에 따라 flag값을 줬는데 왜 null이 나오고 엑셀저장이 활성화 되지 않는지 모르겠다. 이 작업은 이전에 많이 해서 자신있었는데, 안 되니까 너무 당황스러웠다 ...

- 오늘은 화요일이지만, 금요일에 약속이 잡힐 것 같아서 오늘 당일급구알바를 구했다. 며칠 후에 카드값도 나가는데, 그럼 월급날 전까지 생활비가 충분하지 않을 것 같아서 내린 결정이었는데, 오늘은 구로디지털역 쪽에 있는 횟집알바를 하게 됐다. 횟집알바는 처음해보는데, 힘들지만, 재밌을 것 같다.


02.01 (수)

- 오늘은 2월 첫날이다. 어제 알바를 갔다오고 집에와서 씻으니까 한 2시 정도였다. 바로 잠들었는데, 아침에 좀 피곤했지만, 지각하지 않고 잘 도착했다. 

- 오전에는 어제 했던 엑셀 관련 작업을 이어나갔다. 사실 어제 다 하고 가려고 했는데, 계속 처음보는 오류들이 나와서 애를 먹었다. 

- 오전에, MTS 단의 다른 개발자분이 증거금해지와 관련한 결과값이 각각 어떤 것인지 물어보셨다. 팀챗으로 증거금 해지에 관련한 키값이 무엇이고, 디폴트 상품이 많은 결과값에는 합산한 증거금해지가 들어간다고 말씀드렸다. 또 다른 개발자분에게 TR을 돌렸을 때 나오는 결과값에 데이터가 포함되는 유무에 따라 메시지 코드를 통일해야한다는 사수의 말을 전했다. 요즘은 다른 개발자분들과 소통을 자주하면서 그 때 그 때 필요한 정보나 서로 애매한 부분을 해결해나가는 것 같다. 

- 점심은 사내식당에서 권과장님이랑 같이 먹었다. 권과장님도 다른 증권사에서 이곳으로 이직해온 케이스인데, 어제 캐피탈 관련한 회사에 대해 좀 물어보고, 과장님의 시각에서 증권사에 대한 생각을 들을 수 있었다. 권과장님도 벤처기업도 친구랑 같이 해보셨다고 하고 여러 개발직도 해봤지만, 성향 차이인 것 같다고 하셨다. 물론, 내가 상반기에 어떤 회사를 붙을지는 모르지만, 결국 내 선택이 내 진로를 결정할 것이기에 나도 미래는 어떻게 될지 모르겠다.

- 점심에는 조금 눈을 붙이고, 오후업무를 시작했다. 오후에는 엑셀저장 문제를 계속 이어나갔는데, 해결이 도통 안되니까 이거는 정말 경로문제 처럼 보였다. 진교형께 도움을 요청해서 한번 봐주시라고 했다. 근데, 진교형도 왜 충돌이 났는지 모르겠지만, struts파일이 다른 경로에 속해있어서 계속해서 오류가 난 것 같다고 말씀하셨다. 누군가가 빌드를 하기 전에 upate를 쳤어야 하는데, 안치고 commit을 해서인지 영문은 모르지만 xml파일이 엉뚱한 곳에 있었다. History를 보면, 일단 적어도 내가 커밋하기 전부터 있었던 문제였다.

- 경로문제를 해결하고 빌드를 하니 드디어 엑셀이 열리게 됐다. flag값을 null로 인식해서 엑셀저장 버튼이 아예 눌려지지 않는 현상이 해결된 것만으로도 기뻤다. 이제는 금방하기 때문이었다. 엑셀 jsp파일과 조회 jsp파일을 알맞게 수정하고 코드를 짰다. Dao자바파일에도 함수 안에 쿼리를 추가하면서, 엑셀 저장이 올바르게 나올 수 있도록 처리하였다.

- 다 된 것 같았지만, 한 문제가 생겼다. 엑셀저장을 누르고 엑셀파일을 받는 도중이나 후에 다른 페이징으로 이동을 하면, 프로그레스바가 생기면서 오류가 생겼다. 이 문제는 인턴 초기에 어떤 주석을 통해 submitAction값에 false값을 주면 해결되리라 예상했고 적중했다.

- 다만, 이제는 또 두가지 문제가 생겼는데, 하나는 엑셀파일에 1페이지에 있는 데이터만 저장되는 문제와 이유는 모르지만, 쿼리는 잘 나오는데, 데이터가 null값으로 처리되어 엑셀에 안 보여지는 문제였다. 쿼리 이상은 절대 아니었다.

- 뿌려주는 것에서 문제가 있다고 판단해서 Dao파일에서 flag값에 따라 엑셀은 SetToList를, 단순 조회는 SelectPageToList를 사용했다. 처음에는 다른 '엑셀저장' 기능을 하는 jsp와 dao파일 svc파일을 비교해보면서 바꿔서 넣었는데, 이 부분이 바로 전체 데이터를 다 뿌려주는지, 특정 페이지만 뿌려주는지를 결정하는 함수였다. 

- 하지만, 여전히 문제는 해결되지 않았다. 이건 정말 데이터를 못 가져오는 것밖에 답이 없었다. 고전 끝에, 드디어 뭐가 잘못된지 알아냈다.

- 엑셀 jsp와 홈페이지 jsp에서 "dataObj"라는 키값에 저장되어 있는 데이터를 가져오는데, 엑셀 jsp에서는 "formMap"이라는 키값을 get하였다. "dataObj"에 데이터가 있지, "formMap"에는 없으니 당연히 엑셀에서는 못 뿌려준 것이였다. 홈페이지 jsp에서 데이터를 어디서 가져오는지 보고 엑셀에도 동일하게 적용시켜줘야 했다.
- "dataObj"의 value에 해당하는 맵 데이터를 가져왔을 때, 해당 맵 데이터가 비어있지 않다면, 맵 데이터에 "list" 라는 이름으로 키값이 설정된 데이터를 가져와야 한다. 그래야 이 리스트를 iterator를 돌면서 뿌려줄 수 있기때문이다.
- Dao파일에 있는 쿼리를 통해 paramMap에 포함되어 있는 flag값에 따라 리스트를 가공해 반환해준다. 이 반환된 리스트는 Svc파일에서 새로운 해시맵에 "List"라는 이름의 키값으로 데이터를 저장한다. 그런데, 엑셀jsp에서 이 데이터를 가져올 때 키 값이름으로 "LIST"가 아닌 "RESULT:LIST"로 해서 당연히 못가져온 것이었다.
- 즉, Svc파일에서 해시맵에 저장한 키값이름과 동일한 키값이름으로 jsp에서 get해야하는 것이었다. svc파일에서 키값이름을 바꾸면 그 바꾼 이름으로 get해야 한다. 홈페이지 jsp도 마찬가지다.
- 이렇게 흐름을 따라가다보면, 분명 의심가는 곳이 있고 고쳐나가다보면 깨달아지는 것 같다. 

02.02 (목)

- 일어나니까 7시 20분 오마이갓,,! 씻고 무진장 뛰었다. 정시 도착,,살았다..! 역대급으로 할 거 다하면서 빨리 준비한 아침이었다.

- 오늘 알았는데, 아침에도 사내식당에서 조식메뉴를 살 수 있었다. 고정메뉴인 김밥2줄, 라면, 국밥, 달걀2개+두유+바나나 는 2천500원이고, 조식메뉴랑 샐러드 메뉴는 맨날 바뀌는 듯 했다. 나도 다음번에는 김밥 2줄에 2천500원이어서 이걸 먹으려고 한다. 진교형이 아침에 좀 나눠준 김밥이 너무 맛있더라..

- 이른 아침부터 다른 개발자분께 연락이 왔다. MTS 단에서, 투자성향팝업을 띄울 때, 필요한 고객의 투자성향 키값이 안넘어온다는 요청이셨다. ppt 개발 설계서를 찾아본 후에, 내용을 확인하고 디폴트가 아닌 일반매수 Dao파일에 있는 투자성향 관련 쿼리를 디폴트 매수 관련 Dao파일이 아닌 SVC파일에 그대로 넣어주었다. 그리고, 기존에 getBean을 통해 서비스를 탔던 result 맵에 새로운 키값을 정해줘서 해당 데이터를 put하였다.

- 값이 잘 나오는지 확인차 다시 소통했고, 값은 오는데, 데이터 구조가 조금 특이하다는 답변을 받았다. 이번 MTS관련한 서비스개발에서는 구조가 쿼리마다 왔다갔다 한다고 하셨다. 화면 단에서 물론 값을 추출할 수는 있지만, 나중에 유지보수할 때 서비스마다 데이터구조가 다르면 번거롭고 알아보기도 힘들기 때문에 통일성을 잡을 필요가 있었다.

- 이 문제가 예전부터 겪어온 데이터가 안쪽으로 들어오는 문제인데, 오늘 이 문제를 제대로 뜯어봐야했었다. 이번에 새로 만든 쿼리들은 거의 다 안쪽으로 들어온다는 MTS단 개발자님의 말에 같이 대면으로 소통을 시작했다. 

- 정말 많은 시행착오를 겪어도 안됐다는 다른 개발자 분의 말을 듣고 오기가 생기기도 했다. 구글링을 하면서 계속해서 필요한 정보에 대해 찾아갔다.

[첫번째로 접근한 방식]
: getBean을 통해 서비스를 타서 나온 temp Map을 찍어보면, 해시맵 안에 또 다시 해시객체가 들어있는 것을 확인했다. 그래서 get을 이용해서 바깥쪽 키값으로 해당 객체를 꺼내고 이 맵 형태로 보여지는 객체를 for문을 통해 각 필드값과 value를 새로 선언한 맵에 put함으로써 다시 반환된 맵을 최종으로 반환해야 하는 맵에 할당해줬다. 이런 과정을 거쳤지만, entrySet이라는 키값을 가진 데이터가 데이터 안쪽으로 들어갈 뿐, 원하는 결과로 이어지진 않았다.
[두번째로 접근한 방식]
로그를 찍어보니까 getBean을 통해 서비스를 타서 나온 temp Map은 해시맵 형태였다. 근데, 해시맵 안에 또 해시맵 처럼 보이는 구조가 있었는데, 보통 해시맵이면, " : (콜론) " 으로 key, value가 나뉘어지는데, 로그에서는 " = " 으로 key, value를 나누고 있었다. 여기서부터 좀 의심이 들었다. 첫번째로 접근한 방식에서도 get을 연속해서 2번하면 될 것 같았는데, 바깥쪽 key값으로 get한 객체는 해시맵이 아니라 그저 Object라고 오류를 내뿜으니 Object를 새로운 함수의 인자값으로 넣어서 getClass().getDeclaredFields() 로 for문을 돌린 것이다.
Object는 해시처럼 get함수를 가지고 있지 않으니까, Object에서 key, value를 가져오는 방식을 생각했어야 헀다.

[세번째로 접근한 방식]
Object형태에서 데이터를 가져오려면, 이를 HashMap화 시켜서 get을 쓰면 되지 않을까? 해서 그런 방식으로 접근해봤다. 하지만, 계속 Object는 get함수를 가지고 있지 않다는 오류만 나올 뿐이었다. 어쩔 수 없이 돌아가는 방법을 생각해봤어야 했다. Object를 HashMap으로 바꾸고, 해당 HashMap에서 getKey(), getValue로 for문을 통해 key, value를 새로운 resultMap에 넣는 방법 혹은 Object를 String List로 바꿔서 for문을 통해 key, value를 넣는 방법이 있었다. 이를 위해서는 ObjectMapper라는 클래스의 라이브러리를 불러와야 했는데, 그런 라이브러리를 불러올 수가 없었고 StringList관련한 라이브러리도 마찬가지였다. 아예 Object를 다른 객체로 변환하기가 불가능한 상황이었다.

[네번째로 접근한 방식]
혹시나 "="으로 변한 값이 JsonObject는 아닐지 의심해봤다. JsonObject에서 파싱하는 방법으로 데이터를 찾고 넣어줘야 하는 것인가라는 의심으로 구글링을 해봤다. 하지만, 이 역시 아닌 것 같았다. 필요한 라이브러리와 설치해야 하는 모듈이 존재했고, 이는 불가능했다. MTS가 아닌 기존 서비스에서는 getBean을 사용하는 방식이 아닌 쿼리를 다 넣고 결과값을 만들어냈다. 정 안된다면 이 방법을 써야 하는데, 그러긴 싫었고, 당연히 효율이 말도 안되게 좋지 않았다. 유지보수하기에도 복잡하기 때문에 getBean으로 이미 다 만들어 놓은 것을 뒤집기도 애매했다.

[다섯번째로 접근한 방식 - 해결]
예전에 Java를 좀 하신 과장님께 여쭤봤는데, 과장님이 제 설명을 듣고 얼핏 하신 얘기가 내 뇌리에 꽂혔다. "Object 객체도 Map객체로 변환하면 Map이 된다는 소리인데...", Javascript에서 object에서 Key, Value를 뽑아내는 기능이 있는데, JS이지만 java에서도 될까 하는 이런저런 얘기가 나오다가 한 번 해보겠다고 하고 생각을 실행에 옮겼다.
Object temp2 = temp.get("PARAM"); 로 해서 temp2로부터 변환을 출발하려는 게 아니라,
Map temp2 = (Map) temp.get("PARAM"); 으로 아예 객체를 맵으로 형변환 시키면 바로 원하는 키값에 접근가능했다.
맵으로 형변환 시키는 방법이 ObjectMapper 라이브러리가 아니라 이렇게 (Map)만 적어주니까 바로 가능할 수 있었고 해당 링크(https://okky.kr/articles/335079).의 질문자분이 남겨준 글에 달린 댓글들을 보면서 도움이 된 것 같다! 

드디어, 다른 개발자분도 며칠동안 고생했던 데이터 구조 이슈가 해결되는 순간이었다!! 이제, 해당 SVC파일에 가서 flag값에 따른 Dao파일에 있는 함수를 타고 들어가 함수에서 put해준 키값을 똑같은 이름으로 tempMap으로부터 뽑은 데이터와 같이 최종 결과 맵에 put해주면 완벽히 해결되는 로직이었다.

이제부터, 그간 데이터 구조가 바깥쪽으로 나온 케이스를 MTS단과 하나하나씩 맞춰보면서 해결해야 한다. 해결한 문제를 바로 다른 개발자분에게 공유를 해드렸더니 좋아하셨고, 권과장님과 진교형도 잘했다고 하셔서 뿌듯했다!  

- 오늘은 퇴근 후에, 부장님과 진교형과 양고기를 먹는 저녁 약속이 잡힌 날이다. 회사돈이니까 마음껏 먹으라고 하시는데, 정말 기대가 된다. 양고기에 술까지 먹을 것 같은데, 양고기는 꼬치로만 먹어봤지 따로 안먹어봤기 때문에 설렜다.

- 저번주에 미리 잡힌 약속이라 내가 예약을 잡았는데, 오늘 다시 전화해서 예약이 제대로 됐는지 확인전화를 식당에다가 했다. 예약이 제대로 잡혀있었고, 이제 남은것은 음식을 즐기면 됐다. 가기전에 주도를 찾아봤는데, 술 먹을 때 받는 예절, 드리는 예절 마시는 예절 등을 숙지했다! 양고기 즐기러 가보자고~


02.03 (금)

- 미친 하루다. 어제 퇴근하고 양고기 1차부터 시작해서 4차까지 술을 계속 마셨다. 원래 술을 잘 안 마시는 나로서는 정말 역사적인 날이라고 봐도 과언이 아니다. 그만큼 술을 잘 안마시는데,(1년에 진짜 5번도 안 마시는 것 같다)  회사 사람들이랑 처음 술 자리를 한 것이기도 해서 너무 오버페이스를 한게 아닌가 싶다. 어제 너무 달렸던게 화근인걸까.. 오늘 아침 정말 숙취가 심했다. 머리 아픈 것은 샤워하니까 괜찮아졌는데, 속이 좀 울렁거렸다.

- 하긴 어제 밤에 집에 들어오니까 자정이었으니 대략 5시간 밖에 못잤기에 술이 덜 깰 수 밖에 없었다. 사실 3차부터는 잘 기억도 안 난다. 뜨문뜨문 기억날 뿐이다. 살면서 술을 먹고 기억이 안 난 적이 없었는데, 이런 경험은 처음이었다.

- 출근을 했을 때는 사수인 진교형은 미리 차장님께 말씀드려서 10시에 출근하신다고 하셨다. 금요일이라 비교적 여유로운 하루여서 가능한 일이었다. 난 출근은 했지만, 술이 안 깬 느낌이 지속됐다. 몸이 기우는 느낌이 종종 들었고, 무엇보다 집중을 할 수 없을 정도로 뇌가 막힌 느낌이었다. 

- 오전에 1시간동안 팀끼리 티타임을 가지는 시간에, 아직도 술에 안깼는지 평소에는 경청하는 스탠스지만, 내가 말을 주도적으로 많이 한 것 같다,,ㅋㅋ 술 얘기, 나이 얘기, 주식 얘기, 과장님 차장님의 과거 대학교 시절 얘기 등등 많은 이야기를 나누니 시간이 어느새 9시가 넘었었고, 다시 업무를 시작하였다. 

- 아직 프론트쪽에서 설계서가 안나왔고, 진교형도 없는 상황에 마땅히 내가 할 업무가 보이지 않았다. 그저 뇌가 멍할뿐,,ㅎㅎ정말 내가 봐도 어제의 내가 신기하다. 술을 정말 정말 많이 먹은 것 같다. 거의 소주 5병은 먹은 것 같은데, 맥주도 먹었으니 정말 기록이다.

- 10시가 조금 넘어서 진교형이 조금 힘든 표정을 하시면서 출근하셨다. 결국, 진교형은 일을 못하겠다며 11시 30분에 반차를 내고 집에 가셨다. 가면서 같이 약국에 들려 숙취세트를 사주셨고, 둘이 같이 먹고 형은 택시를 타고 집에 가겼다.

- 속이 너무 안 좋아서 아무것도 들어가지 않을 것 같아, 나도 점심식사를 거르고 그저 물을 마시면서 의자에 앉아서 쉬었다. 잠깐 잠이 들었는데, 일어나니까 갑자기 토를 할 것 같은 신호가 입으로 올라왔다. 바로 화장실로 달려가서 내리 토를 했다. 22살 이후로 토를 처음 한 순간이었다. 정말 최악이다 최악ㅋㅋ,,입을 헹구고 양치도 하면서 다시 의자에 앉는데, 역시나 정신은 몽롱하니, 뭐 제대로 일도 못하고 그저 앉아있을 뿐이었다.

- 어제 너무 많이 받아먹은 것 같다. 절대 강요는 안하셨지만, 아무래도 첫 회식이고 긴장도 한 터라 나도 모르게 엄청 먹은 것 같다. 2시간이 지났을까,, 또 다시 화장실로 달려가 토를 했고,,과장님이랑 차장님이랑 또 이런 저런 얘기를 하는 시간에 제가 사실 화잘실에서 토를 했다고 말해버렸다..ㅎㅎ이런 것은 숨겨야 됐었는데,,

- 오늘은 급구 알바를 안 구해놓은 것이 다행이었다. 과장님과 차장님께서는 조금 측은한 표정을 지을 정도셨다. 생각해보면 나는 아직까지 정말 취한 것 같다. 

- 그렇게 시간이 빨리 가기만을 기다리는 하루가 됐고, 중간에 상무님도 오셔서 모닝케어를 건네시면서 마시라고 권유하셨다. 감사하다고 말씀드렸는데, 뭐 물도 잘 안들어가는 상황이고 아까도 숙취세트를 다 먹다가 토해버려서 정중히 거절하고 커피라도 마실거냐고 권유하시면서 어제 회식 때 술을 잘 마신다고 들었다고 하셨다...ㅋㅋ,,그 말을 듣자마자 바로 "아,,아닙니다..! 저도 지금 많이 힘든 것 같습니다,,ㅎ하하" 이런식으로 나의 힘듦을 최대한 표현했다..!

- 조용히 자리에 있다가 퇴근을 하는데, 부장님께 인사를 드릴 때, 들었던 말이 나의 힘듦이 너무 티났는지 걱정되게 만들었다..ㅎㅎ"어휴~결국 너도 버티는줄 알았는데, 얼른 집에가서 쉬어라~ ㅎㅎ" ..아마도 어른들 눈에는 내가 힘들어하는게 보였나보다...집가는길에 콩나물국을 먹고 이온음료를 사들고 푹 쉬어야겠다..! 

 

-  몸에서 알코올을 완~전히 0으로 분해하는 데까지 걸리는 시간은 약 42일이라고 한다. 원래 술을 거의 안 먹는데, 최근 들어서 친구들과 한 잔씩 하고, 회사에서도 폭음을 했다..

- 신념을 다시 지켜보자. 사실 술은 맛이 없는데, 요즘 유독 술 약속이 많아졌다...매년 먹지 않았는데, 자제하자! 술은 진짜 일상생활에서 최대의 효율을 내지 못하도록 하는 기폭제 같다. 정말 한동안은 안 마셔야겠다!

- 이번주 일요일에도 약속, 다음주 토요일도 약속인데, 술은 안 마셔야겠다..!

반응형