본문 바로가기
반응형

Framework & Library/Spring Boot164

[Spring Boot] : 로그 추적기 오늘 로그 추적기를 만들었다. private String id; private int level; TraceId 클래스에 여러 생성자를 만들어 주었다. public TraceId(String id, int level) { this.id = id; this.level = level; } public TraceId() { this.id = createId(); this.level = 0; } public String getId() { return id; } public int getLevel() { return level; } TraceId를 creat할 수 있는 생성자들이다. @Getter public class TraceStatus { private TraceId traceId; private Long .. 2022. 6. 22.
[Spring Boot] : 파일 업로드, 파일 다운로드 구현하기 파일 업로드와 파일 다운로드를 구현해 봤다. private String uploadFileName; private String storeFileName; public UploadFile(String uploadFileName, String storeFileName) { this.uploadFileName = uploadFileName; this.storeFileName = storeFileName; uploadFileName는 고객이 업로드한 파일명이다. storeFileName는 서버 내부에서 관리하는 파일명이다. 서로 다른 고객이 같은 파일을 업로드할 때 충돌날 수 있어서 서버에는 이름이 겹치지 않게 저장해야 한다. 때문에 파일명을 분리했다. @Value("${file.dir}") private St.. 2022. 3. 18.
[Spring Boot] : 스프링과 파일 업로드 스프링은 MultipartFile 이라는 인터페이스로 매우 편리하게 지원을 한다. @PostMapping("/upload") public String svaeFile(@RequestParam String itemName, @RequestParam MultipartFile file, HttpServletRequest request) throws IOException { log.info("request={}", request); log.info("itemName={}", itemName); log.info("multipartFile={}", file); if (!file.isEmpty()) { String fullPath = fileDir + file.getOriginalFilename(); log.info.. 2022. 3. 17.
[Spring Boot] : 서블릿과 파일 업로드(2) 서블릿이 제공하는 Part 에 대해 공부하고 실제 파일도 서버에 업로드 하는 실습을 진행했다. 먼저 파일이 저장될 경로를 만들어 준다. C:\\git\\core_Study\\MVC2\\upload\\file 나는 이런 경로를 가지고 왔다. 이 경로를 어디에 적냐면 file.dir=C:/git/core_Study/MVC2/upload/file/ application.properties에 적어준다. 여기서 주의 할 점으로는 마지막에 / 를 넣어줘야 한다는 점이다. @Value("${file.dir}") private String fileDir; 컨트롤러에서 아까 저장한 경로 변수를 Value로 넣어주면 알아서 파일 위치를 확인한다. //데이터 읽기 InputStream inputStream = part.ge.. 2022. 3. 17.
[Spring Boot] : 서블릿과 파일 업로드(1) 파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야 한다. 하지만 여기서 이름,나이,첨부파일을 보낼 때 바이너리 데이터뿐만아니라 문자 데이터도 전송해야 하는데 이 문제를 해결하기 위해 HTTP는 multipart/form-data 라는 전송 방식을 제공한다. 먼저 서블릿을 통한 파일 업로드 실습을 진행했다. @PostMapping("/upload") public String saveFileV1(HttpServletRequest request) throws ServletException, IOException { log.info("request={}", request); String itemName = request.getParameter("itemName"); log.info("item.. 2022. 3. 17.
[Spring Boot] : Spring이 제공하는 기본 포맷터 스프링은 수 많은 포맷터를 기본으로 제공한다고 한다. 그 중 이번 강의에서 사용해 본 포맷터는 @NumberFormat 으로 숫자 관련 형식을 지정할 때 사용하는 포맷터와 @DateTimeFormat 으로 날짜 관련 형식 지정 할 때 사용하는 포맷터이다. @Data static class Form { @NumberFormat(pattern = "###,###") private Integer number; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime localDateTime; } 포맷터에 사용되는 어노테이션으로 형식을 지정해 DTO를 생성해 사용하면 된다. 여기서 @DateTimeFormat을 사용할 때 형식 중 달은 MM .. 2022. 3. 16.
[Spring Boot] : 포맷터를 웹 애플리케이션에 적용하기 이번에는 포맷터를 웹 애플리케이션에 적용해 봤다. // registry.addConverter(new StringToIntegerConverter()); // registry.addConverter(new IntegerToStringConverter()); 우선 전에 만든 컨버터를 주석처리했고 registry.addFormatter(new MyNumberFormatter()); 포맷터를 추가해 주었다. 주석 처리한 컨버터와 새로 추가한 포맷터는 서로 기능이 겹치는데 우선 순위는 컨버터가 높아 포맷터가 적용이 되지 않고 컨버터가 적용이 되어 버리기 때문에 주석 처리를 해 주었다. 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다. 2022. 3. 16.
[Spring Boot] : 포맷터를 지원하는 컨버젼 서비스 이번 강의에서는 컨버전 서비스를 만들고 포맷터와 컨버전을 등록하고 테스트를 진행했다. 포맷터를 지원하는 컨버전 서비스를 사용하면 컨버전 서비스에 포맷터를 추가할 수 있다. 내부에서 어댑터 패턴을 사용해 Formatter가 Converter처럼 동작하도록 지원한다고 한다. FormattingConversionService는 포맷터를 지원하는 컨버전 서비스이다. DefaultFormattingConversionService는 FormattingConversionService에 통화나 숫자 관련 포맷터를 제공한다. @Test void formattingConversionService() { DefaultFormattingConversionService conversionService = new DefaultF.. 2022. 3. 16.
[Spring Boot] : Formatter, 포맷터 적용하기 포맷터는 객체를 특정한 포맷에 맞춰 문자로 출력하거나 그 반대 역할을 하는 것에 특화된 기능이라고 한다. 그냥 컨버터의 특별한 버전으로 이해하면 된다. 이번 강의에서는 포맷터를 적용해 보고 간단한 설명을 해줬다. 우선, 컨버전과 차이다 Converter은 범용(객체 → 객체)이고, Formatter는 문자에 특화되어 있다고 한다.(객체 → 문자, 문자 → 객체) + Locale(현지화) public class MyNumberFormatter implements Formatter { @Override public Number parse(String text, Locale locale) throws ParseException { log.info("text={}, locale={}", text, locale).. 2022. 3. 16.
[Spring Boot] : 뷰 템플릿에 컨버터 적용하기 뷰 템플릿에 컨버터를 적용해 본다. 타임리프는 렌더링 시 컨버터를 적용해 렌더링하는 방법을 편리하게 지원한다고 한다. @GetMapping("/converter-view") public String converterView(Model model) { model.addAttribute("number", 10000); model.addAttribute("ipPort", new IpPort("127.0.0.1", 8000)); return "converter-view"; } Model에 숫자 1000과 ipPort 객체를 담아 뷰 템플릿에 전달한다. ${number}: ${{number}}: ${ipPort}: ${{ipPort}}: 뷰 템플릿에서 이런 형식으로 받는데 잘 보면 어떤 라인은 {{}} 중괄호가 .. 2022. 3. 15.
[Spring Boot] : 스프링에 Converter 적용하기 이번 강의에서는 웹 애플리케이션에 Converter를 적용해 본다. @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToIntegerConverter()); } } WebMvcConfigurer가 제공하는 addFormatters()를 사용해 추가하고 싶은 컨버터를 등록하면 스프링이 ConversionService에 컨버터를 추가해 주게 된다. 스프링에서도 수 많은 기본 컨버터들을 제공하기 때문에 StringToIntegerConverter가 없어도 잘 작동한.. 2022. 3. 15.
[Spring Boot] : myBatis와 JPA 간단 정리 myBatis란? - SQL이 자바 프로그램 내 존재함에 따라 발생되는 SW개발, 소스 관리 및 유지보수의 어려움을 해소하기 위해 개발된 오픈소스이다. myBatis - SQL을 통해 관계형 데이터베이스 제어(CRUD) - 개발자 입력한 SQL을 직접 수행하기 때문에 DB에서 제공되는 SQL을 그대로 사용 가능 - JOIN, GROUP BY 등 사용 가능 JPA - 데이터베이스의 테이블을 객체지향 관점으로 처리하도록 개발 - Hibernate 기반 데이터 처리 - 기본적인 CRUD 기능 - JOIN, GROUP BY 사용이 어렵다. JPA가 왜 뜨게 되었나? - 인터넷 서비스 기업이 급부상 하다 보니까 뜨게 되었다. - SQL의 처리 속도가 가장 느린 쿼리는 조회(Select)이고 그 중에서도 가장 오래.. 2022. 3. 15.
[Spring Boot] : ComversionServcie 사용해 보기 컨버터를 모아두고 묶어서 쉽게 사용할 수 있는 기능이 ConversionService이다. ConversionService는 인터페이스로 구성되어 있는데 단순하게 컨버팅이 가능한지 확인하는 기능과 컨버팅을 하는 기능을 제공한다. 강의에서 이 ConversionService를 코딩해 보면서 어떤건지 알아갔다. @Test void conversionService() { //등록 DefaultConversionService conversionService = new DefaultConversionService(); conversionService.addConverter(new StringToIntegerConverter()); //사용 assertThat(conversionService.convert("10".. 2022. 3. 15.
[Spring Boot] : 타입 컨버터 - Converter 타입 컨버터를 사용하려면 org.springframework.core.convert.converter.Converter 의 인터페이스를 구현하면 되는데 Converter라는 인터페이스가 많아 조심해야 한다. 강의에서 간단하게 숫자와 문자를 서로 변환할 수 있는 두 개의 컨버터를 코딩했다. @Slf4j public class StringToIntegerConverter implements Converter { @Override public Integer convert(String source) { log.info("converter source={}", source); return Integer.valueOf(source); } 문자를 숫자로 만드는 컨버터이다. Integer.valueOf()를 사용해 변.. 2022. 3. 14.
[Spring Boot] : Spring type converter 스프링 타입 컨버터 소개 개발을 하다 보면 문자를 숫자로 혹은 숫자를 문자로 변환하는 등 타입 변환을 해야 하는 일들이 많이 생긴다. 이번 강의에서는 스프링 타입 컨버터를 공부하기 전에 간단한 예시로 타입 변환을 진행해 봤다. String data = request.getParameter("data"); // 문자 타입 조회 Integer intValue = Integer.valueOf(data); // 숫자 타입으로 변경 문자 타입을 숫자 타입으로 바꾸었다. HTTP 요청 파라미터는 모두 문자로 처리되기 때문에 타입 변환을 통해 숫자로 바꿔 준 것이다. public String helloV2(@RequestParam Integer data) { System.out.println("data = " + d.. 2022. 3. 13.
[Spring Boot] : @ControllerAdvice실습 공부 @ControllerAdvice @ExceptionHandler를 사용해 예외를 처리했지만 정상 코드와 예외 처리 코드가 하나의 컨트롤러에 있어서 분리하는 수업을진행했다. @Slf4j @RestControllerAdvice(basePackages = "hello.exception.api") public class ExControllerAdvice { @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArgumentException e) { log.error("[exceptionHandler] ex", e); return.. 2022. 3. 11.
[Spring Boot] : @ExceptionHandler 사용해 보기(2) @ExceptionHandler 사용해 보기(2) @Data @AllArgsConstructor public class ErrorResult { private String code; private String message; } 예외가 발생했을 때 API 응답으로 사용하는 객체를 정의한다. @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler(IllegalArgumentException.class) public ErrorResult illegalExHandler(IllegalArgumentException e) { log.error("[exceptionHandler] ex", e); return new ErrorResult("BAD", e.getMessa.. 2022. 3. 10.
[Spring Boot] : @ExceptionHandler 사용해 보기(1) API는 각 시스템마다 응답 양식과 스펙이 모두 다르다. 하지만 예외 상황에는 예외에 따라 각기 다른 데이터를 출력할 수 있어야 하고 같은 예외도 어떤 컨트롤러에서 발생했는지에 따라 다른 응답을 내려주는 등 세밀한 제어가 필요하다. 여러 API 예외 처리 문제를 해결하기 위해 @ExceptionHandler를 사용한다. 이 어노테이션은 ExceptionHandlerExceptionResolver라는 예외 처리 기능을 제공한다. 스프링은 ExceptionHandlerExceptionResolver를 기본 제공하고 기본 제공하는 ExceptionResolver 중에서도 우선 순위가 가장 높다. 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다. 2022. 3. 9.
[Spring Boot] : 스프링 부트 이해 스프링 부트 이해 경량 컨테이너를 사용하고 있다는 큰 특징이 있다. 자바에서는 프로그램을 사용하기 위해 메모리에 올라가야 자바 프로그램을 사용할 수 있는데 스프링도 마찬가지로 자바에서 메모리에 올려주어야지 가져다 사용할 수 있다. 톰 캣 실행하면 자동으로 메모리에 올라간다. ( 컨트롤러, 서비스, 맵퍼 ) → 이처럼 메모리에 올린 것을 스프링이 관리를 한다. AOP : 관점 지향 프로그래밍 모든 자바 파일은 자바 오브젝트를 상속 받게 되고 중간에 부모가 끼게 된다. 공통 기능은 부모에 공통 기능을 정의하고 가져다 사용하는 방식으로 구현한다. 이렇게 하는 게 객체 지향 프로그래밍 → 문제 발생 : A라는 엄마가 있을 때 자식이 4명이 있다. 엄마의 기능을 모두 다 사용하지 않고 3명만 사용하고 1명만 사용.. 2022. 3. 8.
[Spring Boot] : ExceptionResolver사용하기(2) DefaultHandlerException에 대해 공부했다. DefaultHandlerException는 스프링 내부에서 발생하는 예외를 해결하는데 파라미터 바인딩 시점에 타입이 맞지 않아 생기는 500오류를 HTTP 상태 코드 400오류로 바꿔준다. @GetMapping("/api/default-handler-ex") public String defaultException(@RequestParam Integer data) { return "ok"; } DefaultHandlerExceptionResolver.handleTypeMismatch를 보면 response.sendError()를 통해 문제를 해결한다. sendError(400)을 호출했기 때문에 WAS에서다시 오류 페이지를 내부 요청하게 된다... 2022. 3. 7.
[Spring Boot] : ExceptionResolver 사용하기(1) ExceptionResolver 사용하기(1) 스프링 부트가 기본적으로 제공하는 ExceptionResolver는 HandlerExceptionResolverComposite에 ExceptionHandlerExceptionResolver → ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver 순으로 등록된다. ExceptionHandlerExceptionResolver는 @ExcpetionHandler을 처리한다. ResponseStatusExceptionResolver는 HTTP 상태 코드를 지정한다. DefaultHandlerExceptionResolver는 스프링 내부 기본 예외츨 처리한다. @ResponseStatus(code = .. 2022. 3. 6.
반응형