본문 바로가기

전체 글447

[JAVA] 강의실 배정 https://softeer.ai/practice/6291 Softeer - 현대자동차그룹 SW인재확보플랫폼 김교수는 강의실 1개에 최대한 많은 강의를 배정하려고 한다. 배정된 강의는 서로 겹치지 않아야 하며 수업시간의 길이와 상관없이 최대한 강의를 많이 배정하라. 단, 두 강의의 시작시간과 종 softeer.ai 언어별 시간/메모리 언어시간메모리 JavaScript 5초 256MB C 1초 256MB C++ 1초 256MB Java 5초 256MB Python 5초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB 김교수는 강의실 1개에 최대한 많은 강의를 배정하려고 한다. 배정된 강의는 서로 겹치지 않아야 하며 수업시간의 길이와 상관없이 최대.. 2023. 11. 19.
[JAVA] 성적 평균 https://softeer.ai/practice/6294 Softeer - 현대자동차그룹 SW인재확보플랫폼 N명의 학생들의 성적이 학번순서대로 주어졌다. 학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라. softeer.ai 언어시간메모리 JavaScript 2초 256MB C 1초 256MB C++ 1초 256MB Java 2초 256MB Python 2초 256MB C# 2초 256MB Kotlin 2초 256MB Go 2초 256MB Swift 2초 256MB N명의 학생들의 성적이 학번순서대로 주어졌다. 학번 구간 [A, B]가 주어졌을 때 이 학생들 성적의 평균을 구하는 프로그램을 작성하라. 제약조건 1 ≤ N ≤ 106 인 정수 1 ≤ K ≤ 104 인.. 2023. 11. 19.
Spring MVC vs Spring Webflux 빅데이터를 다루는 데이터 허브 시스템을 개발했다. 물론 굳이 따지자면 개발한 건 아니고, 과거의 누군가 만들어놓은 시스템을 가져와 고객의 입맛에 맞게 기능을 추가 및 수정하고 잡다한 에러를 수정했다. 어쨌든 이 시스템을 고치면서 한 가지 의문점이 들었다. "이거 왜 Webflux가 아니라 MVC로 개발했지?" 빅데이터를 다루는 시스템이다보니, 여러 데이터 소스에서 데이터가 유입된다. 물론 사업 관련이라 자세한 이야기를 기재할 수 없지만 데이터 소스가 그렇게 많지 않다는 고객의 요구사항에서는 크게 상관 없는 부분이긴 하다. 하지만 그래도 명색에 "빅데이터를 다루는 시스템"인데 수많은 데이터 소스에서 데이터가 들어올 수 있는 것을 고려하면 당장은 아니더라도 추후 Webflux로 재개발하는 것이 맞을 것 같다.. 2023. 10. 30.
동시성 제어 옛날에 면접을 보던 중 이런 질문을 받은 적이 있다. "동시에 한 칼럼에 두 명이 접근할 때 동시성 제어를 어떻게 수행하세요?" 물론 면접관님께서는 조금 더 구체적인 예시로 질문을 주셨으나, 어찌됐던 질문 속의 속뜻은 위와 같았다. 그런데 그 당시 나는 아무런 대답을 하지 못했었다. 동시성 제어가 중요한 건 알고 있었지만, 굳이 그걸 실제로 구현해본 적은 없었기 때문이다. 그러다 최근 프로젝트를 진행하며 개발 완료된 모듈에 대한 부하 테스트를 수행하는데, 동시성 제어가 제대로 되어있지 않아 데이터가 제대로 갱신되지 않는 것을 발견했다. 이 상황을 면접 전에 겪었더라면 위 질문에 답변을 할 수 있지 않았을까 하는 아쉬움이 남지만, 어찌됐든 지난 일은 지난 일이니 혹시 모를 다음 면접에 대비하고 또 실무에서.. 2023. 10. 16.
[Apache Server] 리버스 프록시_CentOS, Ubuntu 프로젝트 막바지에 이상한 요구사항이 하나가 전달되었다. 외부에 노출되어야 하는 네 개의 모듈 즉 네 개의 서로 다른 웹사이트가 존재하는데, 외부로 나갈 수 있는 포트는 하나 뿐이니 하나의 포트 안에서 네 개의 모듈을 모두 서빙하라는 요구사항이었다. 처음에는 "이게 무슨 헛소리지..."하면서 당황했었다. 그렇다고 을의 입장에서 "헛소리 하지 말고 포트 네 개 열어주십쇼." 라고 말하기도 뭐했다. 그래서 이를 해결하기 위해 같이 프로젝트를 진행하는 다른 회사의 개발자와 이야기를 하던 중 리버스 프록시로 해결할 수 있을 것 같다는 이야기를 들었다. 그 말을 듣고 옛날에 포트 하나로 두 개의 모듈을 서빙할 때 과장님께서 "리버스 프록시를 활용하라"고 알려주셨던 게 기억이 났다. 때마침 서버 안에 static 파.. 2023. 9. 28.
View와 Materialized View 갑자기 궁금한 게 생겼다. 바로 "View에도 인덱스를 걸 수 있나?" 였다. 그리고 궁금점에 대한 답을 찾아보던 중 몰랐던 개념을 알아냈다. 바로 MATERIALIZED VIEW였다. 얼추 어떤 것인지는 알아냈지만, "알았다!" 하고 아무것도 안하면 분명 까먹을 것이 분명하기에 적어놓으려고 한다. VIEW 우선 VIEW는 데이터베이스의 테이블에서 가져온 결과 세트에 대한 저장된 쿼리이다. 실제 데이터를 저장하지 않고, 특정 쿼리에 대한 결과를 제공하는 "가상 테이블"로 생각하면 된다. 예를 들어서 다음과 같은 DB가 있다고 가정하자. 우선 위 세 개의 테이블에 대한 CREATE와 테스트용으로 사용할 더미 데이터를 입력한다. 참고로 MariaDB는 Materialized View를 지원하지 않아 Post.. 2023. 7. 24.
Batch Insert/Delete 사용자에게 적게는 수 개에서 많게는 수만 개의 데이터를 받아 일괄적으로 처리하는 CRUD API를 개발한 경험이 있다. 처음으로 다량의 데이터를 받아 처리해야 하는 기능을 맡게 되었었다. 그래서 경험이 없어 고민을 했던 게 있다. 그건 바로 "어떻게 하면 보다 빠르게 CRUD가 완료될까"에 대한 고민이었다. 우선 로직은 아래와 같았다. 사용자에게 데이터 리스트를 입력받는다. 데이터를 하나하나 검증해보며 양식에 맞지 않거나 잘못 들어온 데이터를 식별한다. 검증된 정상적인 데이터만 골라내 DB에 Upsert한다. 검증 실패 데이터와, 검증 성공 및 db 정상 입력 데이터를 각각의 리스트에 담아 return한다. JAVA 내부에서는 어쨌든 전달받은 데이터를 개별적으로 검증하는 작업을 해야 하므로 속도를 극대화.. 2023. 7. 22.
Spring Batch 조금 옛날 일이긴 한데, 데이터 코어라는 모듈을 개발하던 중 적게는 수 개에서 많게는 수만 개의 데이터를 일괄적으로 전송받아 처리하는 Batch 모듈을 개발한 경험이 있다. 사실 이 때 이름도 이름인지라 개발을 "Spring Batch"로 하려고 했던 적이 있다. Spring Batch에 대한 경험은 없었으나, 그냥 이름이 동일하고 대량의 데이터를 처리하기 적합한 기술이라는 것 정도는 알고 있었기 때문이다. 하지만 실제로는 Spring Batch로는 이를 구현할 수 없었다. 컨트롤러에서 받은 사용자의 입력을 스프링 배치로 선언한 job에 넣어주려고 보니, 도저히 넣을 수 있는 파라미터 설정 방법이 보이지 않았다. 스프링 배치는 애초에 컨트롤러에서 데이터를 받아 이를 처리하는 모듈이 아니라, 그냥 내부에서.. 2023. 7. 19.
OSIV JPA를 사용하다보면, 종종 특수한 상황에서 LAZY LOADING을 사용해야하는 경우가 있다. 한 번에 관계 데이터까지 가져오기에는 데이터가 너무 대용량인 경우 너무 복잡한 관계를 가진 데이터인 경우 자주 사용하지 않는 데이터를 관계로 가진 경우 그런데 이렇게 LAZY LOADING을 채택해서 Domain 클래스를 구성했을 때 종종 발생하는 에러가 있다. 바로 LazyInitializationException 에러이다. 지연 로딩은 객체가 실제로 필요한 시점에 DB에서 데이터를 로딩하는 방식이다. 그런데 위의 에러는 DB에서 데이터를 로딩해서 세션(영속성)이 종료된 후인데, 다시 한 번 DB에 접근해서 필요한 데이터를 불러오려고 해서 발생하는 문제이다. 즉, View에서 데이터를 보여줄 때 이미 DB에.. 2023. 7. 14.
[JAVA] 코테용 함수들 코딩테스트를 하다보면 List, Set, Map 등의 자료구조를 가져와서 써야할 때가 많다. 대부분은 평소 개발을 하거나 코딩테스트 연습 문제를 풀때는 딱히 인식을 하지 않아도 그냥 손가락이 알아서 쳐주는 함수들인데, 이상할 정도로 코딩 테스트만 가면 기억이 안나는 경우가 허다하다. 그래서 "언젠가는 정리해놓아야지..." 하다가 이제서야 정리를 한 번 해볼까 한다. List 형변환 일단 가장 먼져 형변환 코드이다. array list // array if(true) { // array > list String[] arr = new String[] {"a", "b", "c"}; List list = Arrays.asList(arr); System.out.println(list); // list > arra.. 2023. 7. 8.
[JAVA] 누울 자리를 찾아라_1652 https://www.acmicpc.net/problem/1652 1652번: 누울 자리를 찾아라 첫째 줄에 방의 크기 N이 주어진다. N은 1이상 100이하의 정수이다. 그 다음 N줄에 걸쳐 N개의 문자가 들어오는데 '.'은 아무것도 없는 곳을 의미하고, 'X'는 짐이 있는 곳을 의미한다. www.acmicpc.net 누울 자리를 찾아라 성공 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 16911 6805 5749 41.777% 문제 일 년 동안 세계일주를 하던 영식이는 여행을 하다 너무 피곤해서 근처에 있는 코레스코 콘도에서 하룻밤 잠을 자기로 하고 방을 잡았다. 코레스코 콘도에 있는 방은 NxN의 정사각형모양으로 생겼다. 방 안에는 옮길 수 없는 짐들이 이것저것 많이 있어서 영.. 2023. 7. 7.
[PostgreSQL] 컬럼의 Length를 지정해야 하는 이유 이번 프로젝트에서 데이터 코어 구축 후 데이터 마트까지의 구축을 담당했다. 원래대로라면 데이터 마트 내 테이블의 컬럼들 각각에 length를 부여해줬을 것이다. 하지만 이번에는 구체적인 데이터의 양식이 주어지지 않았고, 그저 협력업체로부터 각 테이블에 들어갈 샘플 데이터 몇 개만 전달받았다. 그래서 데이터의 구체적인 도메인과 Length를 파악할 수 없었다. *협력업체에 문의했는데 자기들도 모른단다. 그래서 어떻게 해야하나 생각을 하던 중 때마침 데이터 마트 구축으로 사용한 DB가 PostgreSQL라는 사실이 생각났다. PostgreSQL은 VARCHAR 등의 칼럼에 굳이 Length를 지정해주지 않아도 됐고, 그래서 컬럼에 length를 지정해주지 않았다. 그러다 감리 진행 중 length를 지정하지.. 2023. 7. 5.