반복영역 건너뛰기
주메뉴 바로가기
본문 바로가기
제품/서비스
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
블로그
열기
메인 페이지로 이동
블로그
기술이야기
블로그
최신이야기
사람이야기
회사이야기
기술이야기
다양한이야기
[행사] 친해지길 바라, '브행시'
브레인저가 되면 누릴 수 있는 것들 ㅣ (4) 동호회 편
최순정
2023.01.27
페이스북 공유하기
트위터 공유하기
링크드인 공유하기
블로그 공유하기
[월간 ABC뉴스] 출시 2달 만에 전 세계 뒤흔든 챗GPT
브레인즈컴퍼니는 브레인저들이 일에만 묻혀 지내지 않고, 동료와 교류를 통해 일상에 활력을 불어넣을 수 있도록 사내 동호회를 운영하고 있습니다.
동호회 활동은 단순한 놀이에 그치지 않고, 자연스럽게 업무에도 적용되고 있는데요.
서로 다른 팀의 동호회원들은 끈끈한 동료애를 바탕으로, 협업 시 서로 배려하며 협동심을 발휘할 수 있습니다.
동호회는 업무와 별개인 것 같아 보이지만, 타 부서와의 소통을 통해 업무 생산성을 올릴 수 있는 수단이 되기도 합니다.
이를 통해 브레인저들은 더욱 행복한 회사 생활을 할 수 있겠죠?
브레인즈컴퍼니는 동호회 활동에 지원을 아끼지 않고 있습니다.
5인 이상이 모이면 누구든지 동호회를 만들 수 있고, 사측에서는 달마다 인당 활동비를 지원하고 있는데요.
(선근님이 본인 지갑을 열 때도 있다는 소문이...
)
브레인즈컴퍼니의 동호회 활동을 살펴볼까요?
첫 번째로,
보드게임 동호회 '하드보드지'
"열심히 보드게임 하지"라는 뜻의 하드보드지는 2016년 12월에 인프라코어팀 용관님의 제안으로 만들어진 동호회입니다.
현재 동호회 회장은 인프라코어팀 동조님이, 총무는 용관님이 맡고 있습니다.
하드보드지의 멤버는 총 13명으로, 인프라코어팀을 비롯해
TC팀, 프리세일즈팀, 영업그룹, 경영기획실 등 다양한 부서와 직급으로 구성돼있습니다.
하드보드지는 보통 한 달에 2~3회 정도 모여 게임을 즐긴다고 하는데요.
플레이타임이 20~30분 정도일 땐 점심 시간을, 30분 이상인 게임을 할 땐 퇴근 이후 시간을 활용한다고 해요.
점심 시간에는 여러 명이 간단하게 즐길 수 있는
텔레스트레이션, 디렉사우, 다크호스, 애비뉴, 사보타지, 스시고파티, 텀블링 다이스 등의 파티게임 위주로 하고,
저녁 시간대는 여유롭다 보니 파티게임뿐만 아니라
데드오브윈터, 모노폴리, 클루, 티켓투라이드, 카르카손, 뱅, 돌팔이약장수 등의 게이머스한 보드게임을 즐긴다고 하네요.
총무 용관님은 보드게임의 매력에 대해
"게임을 보기만 하지 않고 직접 만지고 굴려가며, 같이 플레이하는 사람들과 대화를 하면서 즐길 수 있어요.
또 남녀노소 모두 함께 즐길 수 있다는 것이 큰 장점입니다"라고 전해왔습니다.
필자도 올 1월에 하드보드지에 가입했는데요. 퇴근 후 동료들과 함께 게임을 즐기다 보면, 어느새 스트레스가 해소되는게 느껴졌습니다.
또, 평소 얼굴만 알고 지내던 동료들과 좀 더 친해질 수 있는 계기가 되기도 했고, 끈끈한 동료애가 생기는 것 같아 좋았습니다.
특히, 이번에 가입하면서 생각치도 못했던 보드게임을 선물 받아 설 연휴 때 가족들과 함께 게임을 즐겼습니다. 다음 게임이 또 기다려집니다! :)
두 번째로,
일상에 활력을 불어 넣어 준다는 '풋살 동호회'
풋살 동호회는 2018년 전략사업본부 회식 때 이야기가 나와 만들어 졌다는데요.
주로 TC팀과 영업팀 위주로 구성됐고, 회장 정대님의 운영 하에 13명의 멤버가 활동하고 있다고 합니다.
경기는 월 1회 정도, 주로 목요일 저녁 7시에 진행하고 있습니다.
정대님은 풋살의 매력에 대해
"직장 생황을 하며 운동을 하기가 참 쉽지 않습니다. 더욱이 혼자라면 엄두가 안 나죠.
브레인즈의 풋살 동호회는 한 달에 한 번 정도 부담가지 않는 선에서, 중고등학교 시절처럼 공 하나 놓고 즐기는 분위기로 운영되고 있어요.
그래서 꼭 운동 목적이 아니더라도 일상에 활력이 필요한 분들에게 적극 권유드려요"라고 전해왔습니다.
다들 체력이 좋지 않아, 10분 경기하고 20분 간 경기장에 드러누워 있었던 적도 있다고 하네요.
이처럼 풋살 동호회는 건강 뿐만 아니라 소통과 친목을 위해 진행되고 있으니 실력과 체력에 자신이 없는 분들도 자유롭게 참여할 수 있다고 해요.
풋살 경험이 없어 망설이고 있다면, 일단 가입하시고 가장 풋살을 잘하고 득점을 많이 한 멤버인 TC팀 기열님에게 배워봐도 좋을 것 같아요!
이처럼 브레인저들은 동호회 활동을 통해 행복한 회사 생활을 하고 있습니다.
이 글을 읽고 있는 예비 브레인저 분들!
브레인즈컴퍼니에 합류하게 된다면, 동호회에 가입하고 끈끈한 동료애를 쌓아가시길 바랍니다!
#브레인즈컴퍼니
#브레인저
#사내 동호회
#보드게임 동호회
#풋살 동호회
최순정
경영기획실(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
다음 슬라이드 보기