메시지(Message) 기능 실무를 진행하다 보면 무언가의 이름이 바뀌는 건 심심치 않게 발생한다. 예를 들어 아주 사소하지만 "상품명"이라는 단어를 "상품이름"으로 바꾸라는 지시가 내려왔다고 하자. 만약 화면 수가 수십개가 넘어가는데 일일이 모든 단어를 수정하는 것은 귀찮고 비효율적일 것이다. 스프링은 이러한 다양한 메시지를 한 곳에서 관리할수 있는 메시지(Message) 기능을 제공한다. 예를 들어 아래와 같이 messages.properties 라는 메시지 관리 파일을 만들어 관리할 수 있다. item.itemName=상품명 item.price=가격 item.quantity=수량 ... 이렇게 메시지를 관리하면 상품명을 화면에서 사용할 때 "상품명"으로 하드코딩하지 않고 "item.itemName"..
에러 상황 스프링으로 백엔드를 개발하고 포스트맨으로 API 테스트를 해보려고 했다. 그런데 스프링에서 ambiguous handler methods mapped for HTTP Method 에러를 뱉었다. 해결법 이건 한 Controller에서 매핑되는 URL이 중복되기 때문에 발생하는 에러다. 따라서 메서드들간 매핑되는 URL이 중복되는게 없는지 확인해야 한다. 특히 내 경우에는 아래와 같은 경우가 발생했다. @RestController public class SomeController{ @GetMapping("/v1/{purpose}") public ResponseDto method1(...){ ... } @GetMapping("/v1/{money}") public ResponseDto method2..
에러 상황 윈도우10에서 지원하는 원격 데스크톱 연결을 통해 특정 시스템의 개발 서버에 접속하려고 했다. 그런데 [그림 1]과 같이 'CredSSP 암호화 오라클 수정 때문일 수 있습니다.'라는 에러가 발생했다. 이 문제는 마이크로소프트에서 CresSSP 버전의 원격 코드 실행 취약성을 보완하기 위한 보안 업데이트로 인해 발생하는 것으로 보인다. 해결법 해당 오류는 근본적으로 보안 취약성을 보완해야 하기 때문에 접속을 시도하는 클라이언트와 접속하려는 서버 측 모두 윈도우 업데이트를 진행하는 게 좋다. 대부분 클라이언트와 서버의 윈도우 최신 업데이트를 통해 오류를 해결할 수 있지만, 피치 못할 사정으로 윈도우 업데이트를 진행할 수 없거나 기타 사유로 해결이 안 된다면 아래 방법을 시도해 볼 수 있다. 1)..
파킹통장이란? 파킹(Parking) 통장은 말 그대로 돈을 잠시 주차해 두기에 좋은 통장이다. 입출금이 자유로운 편이며 금리가 일반 입출금통장보다는 높은 편이기 때문이다. 나도 주식을 사기전에 현금을 확보해 두려는 용도로 파킹통장을 활용한다. 주식 계좌에 돈을 넣어놓는것보다 파킹통장의 금리가 더욱 크기 때문이다. 따라서 주식을 사고 싶을 때 파킹 통장에서 돈을 입금해 주식을 사는 전략을 사용한다. 이처럼 파킹통장은 자유로운 입출금과 꽤 높은 금리라는 장점을 활용해 여러 가지 용도로 사용할 수 있다. 물론, 돈을 한동안 꺼내지 않을 거라면 다른 상품을 활용하는게 더 높은 수익을 얻을 수 있으므로 잘 비교해 보자! 파킹통장 금리비교 시중에는 다양한 파킹통장 상품들이 있다. 어떤 상품이 무조건 좋다고는 할 수..
Bean Validation API를 개발하다 보면 DTO에 들어오는 값을 검증해야 할 때가 있다. 예를 들어 이름은 공백이면 안된다던지, 휴대폰 번호는 null이 아니 여야 한다는 등의 조건들이 있을 것이다. 이러한 검증은 Jakarta Bean Validation에서 제공하는 @NotNull @NotBlank, @NotEmpty 등의 어노테이션을 활용하면 간단하다. 어노테이션을 적용하지 않을 경우 @PostMapping(...) public ResponseEntity buy(@RequestBody BuyRequestDto buyRequestDto){ if(buyRequestDto.getName() == null){ return new ResponseEntity("Error", HttpStatus.BA..
문제 https://edu.goorm.io/learn/lecture/17301/cos-pro-1%EA%B8%89-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-java/lesson/839399/1%EC%B0%A8-%EB%AC%B8%EC%A0%9C5-%EC%86%8C%EC%9A%A9%EB%8F%8C%EC%9D%B4-%EC%88%98-java 구름HOME 구름은 클라우드 기술을 이용하여 누구나 코딩을 배우고, 실력을 평가하고, 소프트웨어를 개발할 수 있는 클라우드 소프트웨어 생태계입니다. www.goorm.io COS PRO 1급 기출문제 중 위 문제가 꽤 재밌어서 가져와봤다. N*N 격자에 1부터 N까지의 수가 소용돌이 순서로 있을 때 대각선상에 있는 수들의 합을 구하는 문제다. 풀이 ..
프론트 컨트롤러(Front Controller) 디스패처 서블릿에 대해 알기 위해선 프론트 컨트롤러(Front Controller)에 대해 알아야 한다. 프론트 컨트롤러는 말 그대로 모든 컨트롤러 앞에 있는 컨트롤러이다. 클라이언트의 모든 요청을 앞에서 받고 해당 요청을 처리할 적절한 컨트롤러를 결정한다. 예를 들어 사용자가 로그인을 하려고 하면 해당 요청을 프론트 컨트롤러가 받아 로그인 컨트롤러에게 넘길 것이다. 만약 사용자가 구매 요청을 보낸다면 프론트 컨트롤러는 구매 컨트롤러를 호출할 것이다. 프론트 컨트롤러의 필요성 프론트 컨트롤러를 사용하지 않고 클라이언트의 요청을 일일히 적절한 컨트롤러에 매핑시켜놓으면 어떨까? 이것은 매우 비효율적이다. 웹 서비스를 구현하다보면 필연적으로 공통 기능이 필요하기..
CASE WHEN문 C언어나 JAVA등에서 조건식을 사용하기 위해서는 if문을 주로 사용한다. 오라클도 이와 유사하게 조건식을 사용할 수 있는 방법이 있다. 바로 CASE WHEN문이다. CASE WHEN [조건 1] THEN [출력 1] WHEN [조건 2] THEN [출력 2] ... ELSE [출력 N] END CASE WHEN문의 기본적인 문법은 위와 같다. 프로그래밍 언어에서 사용하는 if문과 거의 비슷하다. CASE WHEN 뒤에 조건을 작성하고, 해당 조건을 만족하면 THEN 뒤의 출력값을 출력하는 식이다. 예를 들어 SELECT CASE WHEN gender = 'M' THEN '남성' WHEN gender = 'F' THEN '여성' END AS '성별' FROM dual; 위와 같이 사..
LOB(Large Object) 타입이란? LOB(Large Object)타입은 오디오, 비디오, 문서 등 다양한 데이터를 큰 용량까지 저장할 수 있는 데이터 타입이다. LOB은 아래와 같이 4가지 종류가 존재한다. BLOB(Binary Large Object) : 바이너리(binary)타입의 어떠한 데이터든 저장할 수 있다. 주로 이미지, 오디오, 영상에 활용된다. CLOB(Character Large Object) : 매우 큰 용량의 문자열 혹은 문서를 저장할 때 사용한다. 고정 길이를 사용한다. NCLOB(National Character Set Large Object) : National 문자열 세트를 저장한다. CLOB과는 다르게 가변 길이를 사용한다. BFILE(External Binary F..
에러 상황 Spring에서 Apache POI를 통해 엑셀 파일을 읽으려고 했다. 그런데 연도(year) 셀을 읽을 때 cannot get a STRING value from a numeric cell 라는 에러가 발생했다. 해당 에러는 숫자가 입력된 셀에서 String을 추출하려고 할 때 발생한다. 그런데 엑셀 파일에서 해당 셀을 확인해보니 셀 서식이 텍스트로 되어있었다. 아파치 POI 라이브러리가 좀 멍청한건지, 숫자로 써져있어도 셀 서식이 텍스트면 String으로 읽어야 하는데 숫자로 읽는것 같다. 해결법 해결법 1 row.getCell(1).setCellType(CellType.String); year = row.getCell(1).getStringCellValue(); 첫번째 방법은 셀타입을 강..