반복영역 건너뛰기
주메뉴 바로가기
본문 바로가기
제품/서비스
EMS Solution
Features
클라우드 관리
서버관리
데이터베이스 관리
네트워크 관리
트래픽 관리
설비 IoT 관리
무선 AP 관리
교환기 관리
운영자동화
실시간 관리
백업 관리
스토리지 관리
예방 점검
APM Solution
애플리케이션 관리
URL 관리
브라우저 관리
ITSM Solution
서비스데스크
IT 서비스 관리
Big Data Solution
SIEM
AI 인공지능
Dashboard
대시보드
Consulting Service
컨설팅 서비스
고객
레퍼런스
고객FAQ
문의하기
가격
자료실
카탈로그
사용자매뉴얼
회사소개
비전·미션
연혁
2016~현재
2000~2015
인증서·수상
투자정보
재무정보
전자공고
IR자료
새소식
공고
보도자료
오시는 길
채용
피플
컬처
공고
FAQ
블로그
열기
메인 페이지로 이동
블로그
기술이야기
블로그
최신이야기
사람이야기
회사이야기
기술이야기
다양한이야기
서버 모니터링의 두 가지 방식
제 6회 브레인즈컴퍼니 패밀리데이
최순정
2023.05.26
페이스북 공유하기
트위터 공유하기
링크드인 공유하기
블로그 공유하기
[행사] Picnic with BRAINZER
브레인즈컴퍼니는 2015년부터 따뜻한 봄이 오면, '패밀리데이
'를 개최하고 있습니다.
패밀리데이는 브레인저들의 가족을 초청해 1박2일 간 함께 연휴를 즐기는 행사입니다.
한 번 참석한 가족들은 다음 패밀리데이를 손꼽아
기다릴 정도로 만족도가 높은 행사인데요.
코로나로 인해 잠시 중단됐던 패밀리데이가
지난 5월 20~21일 양일간 홍천 대명 비발디파크에서 열렸습니다!
가족들이 도착하기 전, 도우미로 나선 브레인저들이 행사장을 세팅했습니다.
헹사장에 도착한 가족들은 간식박스와 음료를 비롯한 웰컴키트를 수령하고,
뽑기를 통해 상품도 함께 받아갔습니다.
또, 차후에 진행될 로또 게임과 행운권 추첨을 위해 사전 등록도 진행했습니다.
브레인즈에서 준비한 웰컴키트와 선물을 한 아름씩 안고 가족사진도 찰칵!
2인 가족부터 3대가 모두 총출동한 가족까지, 약 100여명의 브레인저와 가족들이 참석했습니다.
모두 빠짐없이 추억을 남길 수 있도록 폴라로이드로도 사진을 제공했어요.
본격적인 행사를 시작하기 앞서, 브레인저와 그 가족들이 함께 단체사진을 촬영했습니다.
환한 표정의 참가자들! 기분좋게 행사가 시작됐습니다.
이번 행사는 영업그룹의 막내, 석빈님이 진행했습니다.
행사장 앞 무대에 잔뜩 쌓인 경품들 보이시나요?
첫 번째로, "사회자를 이겨라, 가위바위보!" 게임이 진행됐습니다.
많은 경쟁자를 물리치고 20여명이 무대 앞으로 나와 사회자와 겨뤘고, 최후의 4인이 남았습니다.
그 중 미모를 한껏 뽐내던 꼬마숙녀가 우승해 가족들의 환호를 받으며 상품을 차지했습니다!
다음으로 '청기백기' 게임이 진행됐는데요.
초등학교 입학 전 유아들이 먼저 참여했습니다.
아이들이 참여하다 보니, 마음 약한 사회자는 탈락을 쉽게 외치지 못해 곤혹을 치뤘습니다.
이어, 초등부 게임이 진행됐고 치열한 경쟁 끝에 경품을 차지할 수 있었습니다.
다음으로 중고등부!
이전 게임들에 비해 월등한 실력을
보여줘 우승자를 가리기 어려웠는데요.
결국 최후의 2인이 가위바위보를 통해 상품을 가져갔습니다.
마지막으로 남녀를 나눠 성인부 게임이 진행됐습니다.
한치의 양보도 없
이
진행된 게임의 승자는 브레인저들이 차지했습니다.
성인 여성부 게임에서는 브레인저의 가족들이 우승하며 경품을 나눠갔습니다.
다음으로, 가족이 모두 함께 즐길 수 있는 '파스타면&마시멜로우 탑 쌓기
' 게임이 진행됐는데요.
5분 간 파스타면과 마시멜로우를 잘 조합해 가장 높이 탑을 쌓은 가족 3팀에게 경품을 증정했습니다.
이어서, OX
퀴즈를 풀었습니다.
어린 아이들 눈높이에 맞춰 다양한 문제가 출제됐고,
패자부활전을 거쳐 최후의 4인이 남았는데요.
승자는 ITSM 팀장인 희찬님이 차지했습니다.
이번에는 가족들의 단합력을 높여줄 다각 달리기!
2, 3, 4인 가족으로 나눠 게임이 진행됐습니다.
1그룹 브레인저들이 모두 승리를 거머쥐었네요.
행사장 입장 때 제출했던 로또를 맞히기 위해,
자녀들이 나와 각 번호의 풍선을 터뜨리는 게임이 진행됐습니다.
브레인저들이 옆에서 원하는 번호를 부르며 코치하고, 아이들이 열심히 다트핀
을 던졌습니다.
총 3팀의 가족들이 경품을 가져갔어요.
마지막 게임은 아이들이 가장 기다린 '보물찾기'였는데요.
도우미들이 행사 시작 전 건물 근처에 많은 보물을 숨겨뒀고,
한 명도 빠짐없이 상품을 가져갈 수 있었습니다.
평소 갖고 싶던 선물이 나오자, 활짝 웃음 짓던 아이들!
행사 중 가장 행복한 모습을 보여, 보는 이들도 절로 미소가 나왔네요.
게임이 끝난 후, 행운권 추첨이 시작됐습니다.
최연소 참가자인 인프라웹팀 보람님의 쌍둥이 딸도 추첨에 참여해 눈길을 끌었습니다.
APM팀의 진광님 가족이 1등 및 여러 상품을 휩쓸어가며 부러움을 샀어요.
행사가 끝난 후, 가족별로 모여
브레인즈에서 제공한 한우 불고기를 먹으며
오붓한 시간을 보냈습니다.
이후 각자 숙소에서 자유시간을 갖고,
다음날 오전 역시 브레인즈 측에서 마련한 조식을 먹은 후 집으로 돌아갔습니다.
이번 행사에 참석한 브레인저들이 마음 따뜻해지는 이야기
를 전해왔습니다.
"사춘기에 접어든 큰 아이와 서먹했는데, 기분 전환이 됐는지 좀 나아졌네요.
즐거운 시간이었어요."
"매년 아주 만족하며 행사에 참석하고 있습니다.
준비해주신 도우미분들께 감사드리고, 좋은 행사 계속 됐으면 해요."
"동료들의 가족들을 보니, 무엇인가 알 수 없는 책임감이 더 생기는 것 같아요.
예전에는 나만 잘하면 되지라고 생각
했는데
저와 협업하는 분이
누군가의 아버지이고 어머니라는 것을 느끼며, 더 많이 배려해야 겠다는 생각을 했습니다."
"코로나로 잠정 중지됐다 오랜만에 다시 열려서 기뻐요.
1박 2일 동안 가족들이 행복해하는 모습을 보며 저도 행복
했어요.
맛있는 음식과 깔끔한 숙소 그리고 멋지게 행사 준비한
도우미들이 있어 더욱 즐거운 시간을 보낼 수 있었어요."
#브레인즈컴퍼니
#사내행사
#패밀리데이
최순정
경영기획실(PR매니저)
브레인즈컴퍼니의 소식, 조직문화, 브레인저 이야기를 대내외에 전파하고 있습니다.
필진 글 더보기
목록으로
추천 콘텐츠
이전 슬라이드 보기
IT 인프라 모니터링 시스템의 컨트롤러 개선기, ArgumentResolver를 통한 중복 제거
IT 인프라 모니터링 시스템의 컨트롤러 개선기, ArgumentResolver를 통한 중복 제거
대규모 IT 인프라를 모니터링하는 도메인에서는 서버나 네트워크 장비와 같은 관리 대상을 통칭하여 타겟(Target)이라고 부릅니다. 이에 따라 대다수의 API는 리소스 식별을 위해 URL 경로(Path Variable)나 쿼리 스트링(Query Parameter)을 통해 targetId를 필수적으로 전달받는 구조를 가지고 있습니다. 이 targetId는 단순한 문자열 식별자가 아니라, 실제 비즈니스 로직이 수행되기 전 반드시 선행되어야 하는 일련의 검증 절차를 요구합니다. 구체적으로는 클라이언트 입력값에 대한 유효성 검사, 해당 ID를 기반으로 한 DB 조회 및 도메인 객체(TargetInfoRecord)로의 매핑, 그리고 해당 타겟에 대한 사용자 접근 권한(Authorization) 확인 과정이 포함됩니다. 프로젝트 초기 구현 단계에서는 이러한 전처리 로직을 각 컨트롤러 메서드 바디 상단에 직접 구현하는 방식을 취했습니다. 하지만 API 엔드포인트가 수십 개로 늘어남에 따라, 동일한 검증 코드가 여러 컨트롤러에 산재하게 되는 구조적 문제가 발생했습니다. 이는 단순한 코드 중복(Boilerplate Code)을 넘어, 타겟 검증 정책이 변경될 때마다 관련된 모든 API를 수정해야 하는 유지보수의 취약점으로 이어졌습니다. 또한 비즈니스 로직과 검증 로직이 한 곳에 혼재됨에 따라 코드의 가독성이 저하되고, 수정 과정에서 누락이 발생할 경우 장애로 직결될 위험이 높습니다. 반복되는 검증 로직과 분산된 수정 포인트(N개의 지점) 문제를 근본적으로 해결하기 위해, 다음과 같은 명확한 엔지니어링 목표를 수립했습니다. “타겟 검증, 변환을 메서드 파라미터 주입 시점에 끝낸다.” Spring MVC는 이미 @PathVariable, @RequestParam, @AuthenticationPrincipal과 같이 요청 데이터를 가공하여 컨트롤러 메서드 파라미터에 바인딩하는 표준화된 메커니즘을 제공하고 있습니다. 이 아키텍처 패턴에 착안하여, [ URL에서 타겟 ID 추출 → 유효성 검증 → 도메인 객체 변환 ]으로 이어지는 일련의 과정을 비즈니스 로직 진입 전인 '파라미터 주입 단계'에서 완결짓도록 HandlerMethodArgumentResolver를 적용했습니다. 이 아키텍처를 실제 코드로 구현하기 위해, 프로세스를 크게 세 가지 단계로 나누어 진행했습니다. 메타데이터 정의 (Annotation): 어떤 파라미터를 검증할지 식별하고 정책을 부여 로직 구현 (Resolver & Helper): 실제 값을 추출하고 도메인 객체로 변환하는 바인딩 로직 작성 설정 등록 (Configuration): Spring MVC가 해당 리졸버를 인식하도록 설정 가장 먼저, 컨트롤러 파라미터에 검증 요구사항을 명시할 커스텀 어노테이션을 정의합니다. 1. 커스텀 어노테이션 정의 - @ToTargetInfoRecords 구현의 첫 단계로, 파라미터에 메타데이터를 부여할 커스텀 어노테이션을 정의합니다. 타겟에 대한 모든 정보를 TargetInfoRecord라는 도메인 객체로 캡슐화하여 관리하고 있습니다. 따라서 '해당 파라미터를 TargetInfoRecord 객체로 변환하라'는 명시적인 의미를 담아 @ToTargetInfoRecords라는 어노테이션을 설계했습니다. 이 어노테이션은 런타임 시점에 Resolver가 식별할 수 있어야 하므로 RUNTIME 정책을 사용하며, 파라미터 레벨에 적용되도록 타겟을 한정했습니다. - VALUE_PARAMETER로 메서드 파라미터에서만 사용하도록 제한합니다. - RUNTIME 보존으로 요청 처리 시점에 리졸버가 어노테이션 값을 읽습니다. 2. ArgumentResolver 구현 다음으로 Spring MVC의 HandlerMethodArgumentResolver 인터페이스를 구현하여 실질적인 바인딩 로직을 처리하는 ToTargetInfoRecordResolver를 작성합니다. HandlerMethodArgumentResolver를 상속한 ToTargetInfoRecordsResolver를 생성합니다. 3. 리졸버 등록 방법 구현한 리졸버가 실제로 동작하기 위해서는 Spring MVC의 Argument Resolver 체인에 등록해야 합니다. WebMvcConfigurer를 구현하여 우리가 만든 리졸버를 추가해주면, 이후 들어오는 요청에 대해 Spring이 자동으로 개입하게 됩니다. 이 리졸버를 등록한 후에 클라이언트로부터 요청이 들어오면, 컨트롤러 메서드 호출 직전에 파라미터 단위로 다음 순서가 진행됩니다. 1. Spring이 컨트롤러 메서드의 각 파라미터에 대해 등록된 리졸버 리스트를 순서대로 확인합니다. 2. supportsParameter(...)가 true인 첫 번째 리졸버를 선택합니다. 3. 선택된 리졸버의 resolveArgument(...)를 호출하여 값을 만들고, 그 반환값을 해당 파라미터에 주입합니다. 자세한 구현은 다음과 같습니다. 1) 어떤 파라미터를 내가 담당하는가 — supportsParameter 파라미터에 @ToTargetInfoRecords가 붙어 있으면 자신의 책임으로 판단합니다. 2) 값을 어떻게 만들고 주입하는가 — resolveArgument 3) URL에서 값은 어떻게 추출하는가 — 쿼리 vs 경로 - 쿼리스트링은 webRequest.getParameterValues()로, 경로 변수 HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE로 추출합니다. - 메서드 파라미터 타입이 List인지도 구분하고 검증합니다. 이렇게 헬퍼 클래스를 통해 요청 위치나 데이터 타입에 구애받지 않고 무결성이 검증된 데이터가 준비되면, 변환된 객체가 마침내 컨트롤러 메소드의 파라미터에 주입됩니다. 결과적으로 컨트롤러는 HTTP 요청의 복잡한 세부 사항을 전혀 모른 채, 안전하게 가공된 도메인 객체를 즉시 사용할 수 있게 됩니다. 실제 적용 사례 가장 눈에 띄는 변화는 컨트롤러의 간결함입니다. 기존에는 비즈니스 로직과 섞여 있던 '타겟 ID 추출', '유효성 검사', '도메인 변환', '권한 체크' 등의 횡단 관심사(Cross-cutting Concerns)가 완벽하게 분리되었습니다. 덕분에 개발자는 신규 API를 작성할 때 불필요한 반복 코드(Boilerplate)를 작성하는 수고를 덜고, 핵심 비즈니스 로직 구현에만 온전히 집중할 수 있게 되었습니다. 또한, 유지보수 측면에서도 강력한 이점을 가집니다. 만약 타겟 검증 정책이 변경되더라도 수십 개의 컨트롤러를 일일이 수정할 필요 없이, ArgumentResolver의 로직 한 곳만 수정하면 전사적으로 변경 사항이 반영됩니다. 다수의 API에서 [URL로부터 값 추출 → 검증 → 도메인 객체 변환]의 패턴이 반복되는 프로젝트라면, HandlerMethodArgumentResolver를 적극적으로 도입하여 코드의 품질과 생산성을 높여보시는 것을 권장합니다.
2026.02.06
Spring MVC: 반복되는 검증 로직 한 번에 끝내기
Spring MVC: 반복되는 검증 로직 한 번에 끝내기
인프라 관리 도메인에서 API 설계 시 가장 빈번하게 등장하는 파라미터는 단연 targetId입니다. 하지만 이 식별자는 비즈니스 로직이 실행되기 전, 반드시 통과해야 하는 '삼중 관문'을 가지고 있습니다. 유효성 검사, 도메인 객체 변환, 그리고 권한 확인이 그것입니다. 초기 구현 단계에서는 이 관문들을 각 컨트롤러 메서드 내부에서 직접 제어하는 방식을 택했습니다. 하지만 인프라 규모가 커지고 API 엔드포인트가 늘어날수록, 이 직관적인 방식은 코드 중복과 유지보수 효율성 저하라는 아키텍처적 부채로 돌아오기 시작했습니다. API 엔드포인트가 수십 개로 늘어남에 따라, 동일한 검증 코드가 여러 컨트롤러에 산재하게 되는 구조적 문제가 발생했습니다. 이는 단순한 코드 중복(Boilerplate Code)을 넘어, 타겟 검증 정책이 변경될 때마다 관련된 모든 API를 수정해야 하는 유지보수의 취약점으로 이어졌습니다. 또한 비즈니스 로직과 검증 로직이 한 곳에 혼재됨에 따라 코드의 가독성이 저하되고, 수정 과정에서 누락이 발생할 경우 장애로 직결될 위험이 높습니다. 반복되는 검증 로직과 분산된 수정 포인트(N개의 지점) 문제를 근본적으로 해결하기 위해, 다음과 같은 명확한 엔지니어링 목표를 수립했습니다. “타겟 검증, 변환을 메서드 파라미터 주입 시점에 끝낸다” Spring MVC는 이미 @PathVariable, @RequestParam, @AuthenticationPrincipal과 같이 요청 데이터를 가공하여 컨트롤러 메서드 파라미터에 바인딩하는 표준화된 메커니즘을 제공하고 있습니다. 이 아키텍처 패턴에 착안하여, [ URL에서 타겟 ID 추출 → 유효성 검증 → 도메인 객체 변환 ]으로 이어지는 일련의 과정을 비즈니스 로직 진입 전인 '파라미터 주입 단계'에서 완결짓도록 HandlerMethodArgumentResolver를 적용했습니다. 이 아키텍처를 실제 코드로 구현하기 위해, 프로세스를 크게 세 가지 단계로 나누어 진행했습니다. 1. 메타데이터 정의 (Annotation): 어떤 파라미터를 검증할지 식별하고 정책을 부여 2. 로직 구현 (Resolver & Helper): 실제 값을 추출하고 도메인 객체로 변환하는 바인딩 로직 작성 3. 설정 등록 (Configuration): Spring MVC가 해당 리졸버를 인식하도록 설정 가장 먼저, 컨트롤러 파라미터에 검증 요구사항을 명시할 커스텀 어노테이션을 정의합니다. 1. 커스텀 어노테이션 정의 - @ToTargetInfoRecords 구현의 첫 단계로, 파라미터에 메타데이터를 부여할 커스텀 어노테이션을 정의합니다. 타겟에 대한 모든 정보를 TargetInfoRecord라는 도메인 객체로 캡슐화하여 관리하고 있습니다. 따라서 '해당 파라미터를 TargetInfoRecord 객체로 변환하라'는 명시적인 의미를 담아 @ToTargetInfoRecords라는 어노테이션을 설계했습니다. 이 어노테이션은 런타임 시점에 Resolver가 식별할 수 있어야 하므로 RUNTIME 정책을 사용하며, 파라미터 레벨에 적용되도록 타겟을 한정했습니다. - VALUE_PARAMETER로 메서드 파라미터에서만 사용하도록 제한합니다. - RUNTIME 보존으로 요청 처리 시점에 리졸버가 어노테이션 값을 읽습니다. 2. ArgumentResolver 구현 다음으로 Spring MVC의 HandlerMethodArgumentResolver 인터페이스를 구현하여 실질적인 바인딩 로직을 처리하는 ToTargetInfoRecordResolver를 작성합니다. HandlerMethodArgumentResolver를 상속한 ToTargetInfoRecordsResolver를 생성합니다. 3. 리졸버 등록 방법 구현한 리졸버가 실제로 동작하기 위해서는 Spring MVC의 Argument Resolver 체인에 등록해야 합니다. WebMvcConfigurer를 구현하여 우리가 만든 리졸버를 추가해주면, 이후 들어오는 요청에 대해 Spring이 자동으로 개입하게 됩니다. 이 리졸버를 등록한 후에 클라이언트로부터 요청이 들어오면, 컨트롤러 메서드 호출 직전에 파라미터 단위로 다음 순서가 진행됩니다. 1. Spring이 컨트롤러 메서드의 각 파라미터에 대해 등록된 리졸버 리스트를 순서대로 확인합니다. 2. supportsParameter(...)가 true인 첫 번째 리졸버를 선택합니다. 3. 선택된 리졸버의 resolveArgument(...)를 호출하여 값을 만들고, 그 반환값을 해당 파라미터에 주입합니다. 자세한 구현은 다음과 같습니다. 1) 어떤 파라미터를 내가 담당하는가 — supportsParameter 파라미터에 @ToTargetInfoRecords가 붙어 있으면 자신의 책임으로 판단합니다. 2) 값을 어떻게 만들고 주입하는가 — resolveArgument 3) URL에서 값은 어떻게 추출하는가 — 쿼리 vs 경로 - 쿼리스트링은 webRequest.getParameterValues()로, 경로 변수는HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE로 추출합니다. - 메서드 파라미터 타입이 List인지도 구분하고 검증합니다. 이렇게 헬퍼 클래스를 통해 요청 위치나 데이터 타입에 구애받지 않고 무결성이 검증된 데이터가 준비되면, 변환된 객체가 마침내 컨트롤러 메소드의 파라미터에 주입됩니다. 결과적으로 컨트롤러는 HTTP 요청의 복잡한 세부 사항을 전혀 모른 채, 안전하게 가공된 도메인 객체를 즉시 사용할 수 있게 됩니다. 실제 적용 사례 가장 눈에 띄는 변화는 컨트롤러의 간결함입니다. 기존에는 비즈니스 로직과 섞여 있던 '타겟 ID 추출', '유효성 검사', '도메인 변환', '권한 체크' 등의 횡단 관심사(Cross-cutting Concerns)가 완벽하게 분리되었습니다. 덕분에 개발자는 신규 API를 작성할 때 불필요한 반복 코드(Boilerplate)를 작성하는 수고를 덜고, 핵심 비즈니스 로직 구현에만 온전히 집중할 수 있게 되었습니다. 또한, 유지보수 측면에서도 강력한 이점을 가집니다. 만약 타겟 검증 정책이 변경되더라도 수십 개의 컨트롤러를 일일이 수정할 필요 없이, ArgumentResolver의 로직 한 곳만 수정하면 전사적으로 변경 사항이 반영됩니다. 다수의 API에서 [URL로부터 값 추출 → 검증 → 도메인 객체 변환]의 패턴이 반복되는 프로젝트라면, HandlerMethodArgumentResolver를 적극적으로 도입하여 코드의 품질과 생산성을 높여보시는 것을 권장합니다.
2026.03.06
다음 슬라이드 보기