Hot
- Tomcat 환경설정 (server.xml) - 컨텍스트 경로 설정 톰캣이란? Tomcat은 많은 Java 개발자들이 사용하고 있는 웹 어플리케이션 서버입니다. Tomcat은 웹 어플리케이션이 동작하여 서버의 역할을 할 수 있도록 서블릿 컨테이너를 제공하며 서버 운영에 필요할 수 있는 여러 환경설정 기능을 지원합니다. 스프링 기반으로 생성한 어플리케이션은 기본적으로 별도의 톰캣 서버의 설치가 필요하며 서버의 실행을 위해서는 정해진 경로*에 운영할 웹 어플리케이션을 위치시킨 후 톰캣서버를 실행시켜야 합니다. 반면 스프링 부트는 기본적으로 톰캣서버를 내장하고 있으며 별다른 설정 없이 배포한 Jar 파일을 실행하여 웹서버를 구동할 수 있습니다. 스프링부트를 이용할 경우 내장톰켓을 통해 별다른 설정 없이 손쉽게 웹어플리케이션을 배포하고 서버를 운영할 수 있지만 아직 War 파일..
- [Java api] Active Directory와 연결방법 (LDAP) Active Directory란? 사용자 정보를 저장하고 관리하는 데이터베이스의 한 유형으로 디렉토리 서비스의 한 유형이다. 친숙한 관계형 데이터베이스(MySQL, OracleDB 등)와 다르게 AD(Active Directory)는 도메인 네임 시스템(DNS)을 기반으로한 디렉토리 구조로 데이터를 저장/관리한다. * 이름을 기준으로 데이터에 손쉽게 접근할 수 있다. example) 저장되는 데이터의 name 예시 - 아래처럼 entry를 ,로 나열한 형태이다. CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM ('Fabrikam company 세일즈 팀 Jeff Smith'의 식별이름) 데이터 접근방식 - LDAP AD의 데이터에 접근하기 위해서는 LDAP 프로토콜을 사용한다...
- [multipart/form-data] - MultipartFile과 JSON 함께 받기 (HttpMediaTypeNotSupportedException가 발생하는 이유) 이슈발생 Content-Type을 'multipart/form-data'로 설정한 HTTP 요청의 응답으로 415 Unsupported Media Type (HttpMediaTypeNotSupportedException)이 발생하였다. '파일'과 '복잡한 정보'를 함께 받아야하는 상황이었어서 "복잡한 정보를 JSON 구조로 파일과 함께 보내면 되지 않을까?"란 단순한 생각으로 한 메서드 설계가 원인이었다. 물론 파일과 정보파라미터들을 일반적인 form 형태로 전달해도 되겠지만 file과 JSON을 동시에 받을 수 없을까?란 의문을 해결하고자 한다. 따라서 스프링 MVC에서 Http Message를 어떻게 처리하는지 간단하게 살펴보고 과연 file과 json 데이터를 동시에 받는 작업은 정말 불가능한 일인..
New
- [항해 플러스 백엔드] 8주차 회고 (WIL) DB인덱스와 트랜잭션 분리에 대해 다루었던 지난 한 주도 어느 순간 끝이 났다. 1. 문제서비스가 제공하는 기능에 따라 트랜잭션의 범위는 다르다. 이번 과제는 서비스가 확대되어 서비스를 분리하게 될 경우 예상되는 문제를 어떻게 해결할지 설계하는 것이었다. 트랜잭션의 범위 때문에 서비스를 분리하면 트랜잭션의 문제가 발생하고 이를 해결하기 위해서는 '보상 트랜잭션'이 필요하다. 하지만 '보상 트랜잭션' 개념을 이번에 처음 듣게 되었다. 2. 시도잘 모르는 개념이기 때문에 단순 구글링을 통해 관련 정보를 찾아볼 수 밖에 없었다. 3. 해결보상 트랜잭션을 검색하면 연관해서 MSA 개념을 쉽게 찾을 수 있다. MSA(MicroService Architecture)에서 보장하는 보상 트랜잭션 방법을 참고해서 과제..
- [항해 플러스 백엔드] 7주차 회고 (WIL) 7주는 지금까지 항해플러스를 진행하면서 가장 힘든 한 주였다. 과제가 생각보다 어렵기도 했지만 피로가 몸에 지속적으로 누적된 점도 한 몫했다 생각한다. 과제는 챕터2에서 구현한 서버를 캐싱과 레디스를 활용해 고도화하는 작업이었다. 캐싱처리와 레디스를 사용해본 경험이 없었기 때문에 사용법부터 익혀야만 했다. 1. 문제새로운 개념을 익히는 과정은 생각보다 큰 문제가 되지 않았다. 정작 내 발목을 크게 붙잡은 건 챕터2를 진행할 때 작성했던 내 코드들이었다. 과제 제출에 초점을 두어 기능을 동작하게 만들었지만 구조상 기능사이의 결합도가 크게 형성되었다. 2. 시도이번 과제 내용 중 하나는 DB로 구현된 대기열을 Redis로 옮기는 것이었다. 때문에 처음에는 큰 변경 없이 Redis로 옮기려고 했지만 기존 코..
- [항해 플러스 백엔드] 6주차 회고 (WIL) 이번 한 주 동안 동시성 문제(Race Condition)을 해결하기 위한 방법들을 분석해보고 직접 구현해보았다.분석과정에서 추상적으로 이해했던 DB 락에 대한 이해도를 높힐 수 있었다. 덕분에 앞으로 DB락을 필요한 시점에 더 잘 활용할 수 있을 것이란 자신감이 생겼다. 1. 문제비관적락과 낙관적락의 경우 지속적으로 접해서 괜찮았으나 Redis와 Kafka는 처음 접했기 때문에 개념을 이해하기 어려웠다. 2. 시도Reds와 Kafka를 다루는 유튜브 영상과 블로그들을 살펴보았다. 3. 해결기술적 러닝커브때문에 Kafka에 대한 분석과 구현은 다음기회로 미루고 이번에는 DB락과 Redis 를 다루었다. 4. 알게된 것'분산 서버', 'NoSQL', 'in-memory' 등의 키워드 때문에 어렵게만 생각..
- [항해 플러스 백엔드] 4주차 회고 (WIL) 지난 주차는 서버의 정상 동작을 위해 필요한 기능 구현이 메인이 되는 한 주였다. 3주차 때 작성한 설계를 따라 코드를 작성하였는데, 설계를 만족하는 경우도 존재하지만작성 중간중간 설계를 수정해야하는 일이 종종 발생하였다. 이 과정에서'아... 설계를 꼼꼼하게 작성하지 못했구나'란 생각을 하게 되었다. 설계의 잦은 수정과 함께 개발 시간 지연에 영향을 준 요인은 도메인 모델과 JPA의 완전한 분리였다. 무엇이 문제였을까?domain 레이어의 도메인 모델 객체에서 JPA에 의존하는 요소를 완전히 제거하고,JPA에서 사용하는 도메인 엔티티는 infra 레이어에 위치시켰다.모델의 형태가 단순할 때는 상관 없지만 연관관계를 가질 때는 객체를 전환하는 게 다소 불편했다. 무엇을 했나?null체크를 통해 nu..
- [항해 플러스 백엔드] 3주차 회고 (WIL) 챕터2가 시작되었다. 챕터1에서 TDD와 클린아키텍처를 통해 어떻게 개발을 해야할 지 방법론에 대하여 배웠다면,챕터2에서는 챕터1에서 배운 내용들을 기반으로 실제 서버를 개발하는 방법을 다룬다. 이번 주는 앞으로 개발할 서버에 대한 시나리오를 선택하고시나리오에서 필요로하는 요구사항을 서비스하는 서버의 설계작업을 했다. 3주차에서 겪었던 문제...이번 주에 수행해야 했던 과제는 일반적으로 신규 개발에 들어갈 때 사전에 준비해야하는 작업들이었다. 1. 시나리오 선정2. 시나리오 요구사항 분석 (Milestone / 시퀀스 다이어그램 / 플로우 차트)3. 서비스 설계 (ERD 설계 / API 명세 / Mock API) 평소 회사에서 요구사항에 대해 깊은 고민없이 업무를 진행했었는데, 특히 시퀀스 다이어그램을..
- [항해 플러스 백엔드] 2주간을 되돌아 보며 Intro항해 플러스 백엔드 과정을 진행한지 2주가 지났다. 회사에 입사 후 모든게 낯설었던 시간이 지나고 회사 업무는 익숙함으로 다가왔다.새로움을 위해 이직을 꿈꾸었으나 마음처럼되지 않고 시간이 지나며 쌓이는 경력은내게 두려움으로 다가왔다. 챕터1을 마무리하며 (나의 목표는 안녕한가?)항해를 시작하며 다짐했던 목표 중 하나는 블랙배지를 받는 것이었다.(항해플러스는 매주 2개의 과제를 제출해야하며 10주간의 과제 20개에 대한 통과 결과에 따라 배지 색깔이 달라진다.)2주간 총 4개의 과제를 제출했고 다행히 모두 통과를 하였고,블랙배지로 가는 첫 걸음을 뗀 것 같아 동기부여가된다. 가장 기억에 남는 것개발자 업을 시작하고 약 3년 동안 동시성 제어를 신경쓰지 않고 개발을 했다.현재 재직중인 회사에..
- [Spring Framework] intellij에서 Spring legacy project 구성하기 STS 와 달리 Intellij에는 Spring legacy 프로젝트를 직접적으로 생성할 수 있는 템플릿이 존재하지 않는다. 이러한 이유로 Spring framework를 사용하기 위해 Maven의 Web application 구조에 맞추어 프로젝트를 구성해야 하지만, Intellij Ulitimate 라이선스에서 제공하는 Maven Archetype를 활용해 Spring Legacy 프로젝트를 좀 더 쉽게 구성할 수 있다. 1. Maven 프로젝트 생성 위 이미지 처럼 Maven Archetype을 Generators로 선택한 후 원하는 project 정보를 입력한다.Catalog를 Maven Central로 변경한 뒤 maven 프로젝트를 위한 Archetype을 받아올 수 있도록 설..
- [multipart/form-data] - MultipartFile과 JSON 함께 받기 (HttpMediaTypeNotSupportedException가 발생하는 이유) 이슈발생 Content-Type을 'multipart/form-data'로 설정한 HTTP 요청의 응답으로 415 Unsupported Media Type (HttpMediaTypeNotSupportedException)이 발생하였다. '파일'과 '복잡한 정보'를 함께 받아야하는 상황이었어서 "복잡한 정보를 JSON 구조로 파일과 함께 보내면 되지 않을까?"란 단순한 생각으로 한 메서드 설계가 원인이었다. 물론 파일과 정보파라미터들을 일반적인 form 형태로 전달해도 되겠지만 file과 JSON을 동시에 받을 수 없을까?란 의문을 해결하고자 한다. 따라서 스프링 MVC에서 Http Message를 어떻게 처리하는지 간단하게 살펴보고 과연 file과 json 데이터를 동시에 받는 작업은 정말 불가능한 일인..
- [Spring Security] session 동시 접속자 수 제한 Spring Security 스프링시큐리티는 스프링 기반 웹 어플리케이션에서 '보안'(security)구현을 위한 구조를 제공해주는 프레임워크이며 인증(Authentication)과 인가(Authorization)을 포함한 다양한 기능을 제공한다. 공개되지 않은 어플리케이션 정보에 접근하고자 하는 사용자는 인증이 필요하다. 웹어플리케이션에서 인증된 사용자의 정보는 세션(Session)이나 , JWT(JSON Web token)을 통해 관리할 수 있으며 스프링 시큐리티에서는 이와 관련한 여러 인터페이스를 지원한다. 개발중인 웹 어플리케이션에서 인증 / 인가 기능을 구현하기 위해 스프링 시큐리티를 사용하였는데 로그아웃 후 재 로그인을 하였을 때 로그인이 안되는 현상이 발생하여 스프링 시큐리티 설정하는 방법을..
- Tomcat 환경설정 (server.xml) - 컨텍스트 경로 설정 톰캣이란? Tomcat은 많은 Java 개발자들이 사용하고 있는 웹 어플리케이션 서버입니다. Tomcat은 웹 어플리케이션이 동작하여 서버의 역할을 할 수 있도록 서블릿 컨테이너를 제공하며 서버 운영에 필요할 수 있는 여러 환경설정 기능을 지원합니다. 스프링 기반으로 생성한 어플리케이션은 기본적으로 별도의 톰캣 서버의 설치가 필요하며 서버의 실행을 위해서는 정해진 경로*에 운영할 웹 어플리케이션을 위치시킨 후 톰캣서버를 실행시켜야 합니다. 반면 스프링 부트는 기본적으로 톰캣서버를 내장하고 있으며 별다른 설정 없이 배포한 Jar 파일을 실행하여 웹서버를 구동할 수 있습니다. 스프링부트를 이용할 경우 내장톰켓을 통해 별다른 설정 없이 손쉽게 웹어플리케이션을 배포하고 서버를 운영할 수 있지만 아직 War 파일..