기본적으로 Spring boot 내장 톰캣을 실행하면 8080포트로 서버가 올라갑니다. 서버 포트를 간단하게 바꾸는 다양한 방법에 대해서 알아보겠습니다. 1. application.properties 수정하기 server.port=9999 2. vm option 변경하기 -Dserver.port=9999 두 가지 방식 중에서 편한 방식으로 사용하면 간단하게 톰캣의 서버 포트를 수정할 수 있습니다. 추가적으로 공식 문서에 따르면 server.port=-1로 설정하는 방식을 언급합니다. WebApplicationContext의 생성을 허용하되 내장된 톰캣 서버의 HTTP endpoint를 비활성화하는 옵션입니다. 이렇게 되면 웹 서버를 시작하지 않고 application context가 초기화하는 시나리오를..
web/spring&spring boot
Spring Boot 애플리케이션에서 Self-Signed SSL 인증서를 사용해 HTTPS를 설정하는 방법에 대해 알아보겠습니다. Self-Signed SSL 인증서는 테스트 환경이나 개발 환경에서 테스트할때 쓰입니다. Self-Signed SSL 인증서 발급 받기 Self-Signed SSL 인증서는 PKCS12(Public Key Cryprographic Standards) 와 Java KeyStore 방식을 많이 사용합니다. 둘다 비슷합니다. 다만 Java KeyStore는 자바 언어에만 국한되서 사용할 수 있습니다. PKCS12로 발급 keytool -genkeypair -alias test -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore test..
회사에서 Mybatis를 사용하고 있습니다. DataBase에서는 컬럼명을 snake case로 쓰고 자바에서는 camel case로 필드 이름을 정해주고 있어요. 객체에 값을 제대로 매핑해주기 위해서 쿼리 조회 시 일일이 Alias로 camel case를 적어주고 있었습니다. 그런데 알고보니 몇 가지 세팅만 해주면 이런 노가다는 필요없다는 사실 알고 계셨나요?? 충격을 먹어서 바로 찾아봤습니다. 문제 상황 우선, 왜 이러한 설정이 필요한지에 대해 이해해봅시다. 이미 서론에서 언급하긴 했는데 더 자세하게 알아볼게요. 보통 자바에서는 변수명을 camel case로 표현합니다. 예를 들어, userName, userEmail과 같이 말이죠. 반면에, 데이터베이스에서는 snake case를 흔히 사용합니다. ..
API 호출은 대부분의 애플리케이션 개발에 기본이 되는 작업입니다. 실제로 업무에서 RestTemplate을 사용한 경험이 있는데요. 요새는 다른 방식도 이용한다고 해서 경험해볼 겸 이렇게 글을 작성해봤습니다. 이 게시글에서는, 스프링 부트 프로젝트에서 API 호출을 할 때 사용하는 RestTemplate, WebClient, 그리고 Feign을 비교하고 간단한 예제 코드를 제공합니다. 본 글에서는 https://open.er-api.com/v6/latest에서 한국의 환율을 조회하는 방식으로 예제 코드를 작성했습니다. 1. RestTemplate RestTemplate는 스프링 프레임워크에서 HTTP 요청을 손쉽게 수행할 수 있는 도구입니다. RestTemplate은 동기식 호출을 사용하며, 아래에 예..
우리가 Spring을 사용하는 수 많은 이유중에 대표적인 장점을 꼽으라면 의존성 주입 컨테이너에 관한 내용을 빼놓을 수 없다. 스프링은 자바 빈을 찾아서 ApplicationContext라고 하는 의존성 주입 컨테이너 오브젝트에 등록을 한다. 그리고 애플리케이션이 돌다가 어떤 오브젝트가 필요하다면 의존하는 오브젝트를 찾아서 연결해준다. 그렇다면 스프링은 어떻게 자바 빈을 찾아가지고 의존성 주입 컨테이너에 등록하는걸까?? @Component 어노테이션으로 이 클래스를 자바 빈으로 등록하라고 알려줄 수 있다. 이번 포스팅에서는 이 @Component에 대해서 알아보려고 한다. @Component @Component 어노테이션을 붙이면 이 클래스를 자바 빈으로 등록시키라고 알려줄 수 있다. 해당 어노테이션이 ..
개발자 친구랑 서로 어떤 업무를 하는지 대화를 나누다 보면 심심치 않게 들려오는 Spring batch. batch라는 단어를 생각해보면 병렬처리를 하거나 일괄처리를 할 것 같다는 느낌은 오는데 정확히 무엇인지 모르겠습니다. Spring batch를 언젠가는 쓸 날이 오겠지만, 당장은 쓸 일이 없다면 학습을 나중으로 미뤄두고 바로 적용이 가능하다면 조금 더 찾아보기로 결정했습니다. 그래서 오늘은 쓸 일의 여부를 장점으로 판단할 것이고 그것을 정리한 포스팅을 올립니다. Spring Batch 장점 글자 그대로 Spring Batch 장점이라고 검색을 하면 정말 놀랍게도 모두가 같은 장점을 적어주셨습니다. - 대용량 데이터 처리에 최적화되어 고성능 - 로깅, 통계처리, 트랜잭션 관리 등 재사용 가능한 필수 ..
컴퓨터를 포맷한 뒤로 그동안의 작업물들이 다 사라진 관계로 집에서는 프로그래밍을 하지 않았습니다. 어쩔 수 없이 github에 올라간 프로젝트들이라도 정리해보려고 했는데 위와 같은걸 찾아버렸어요. Todo : RESTful API 과거의 저는 방법을 알지 못하여 한참을 고민만 하다가 끝내 완성하지 못했나 봐요. 그런 과거를 위해 해답을 주려고 합니다. 목표 : 게시글 목록 전달 클라이언트쪽에서 요청이 오면 게시글 목록을 전달해주고 싶었습니다. 아래는 티스토리 게시글 목록 API 예시입니다. GET 요청을 보내면 JSON으로 데이터 목록을 쫘르륵 보내주고 싶었습니다. { "tistory": { "status": "200", "item": { "url": "http://oauth-test.tistory.co..
게시글이 한 줄로 1부터 100000개가 나열되면 불편하겠죠. 불편을 해결하기 위해 페이징 기능을 구현해봅시다. BoardController @GetMapping("/board/list") public String list(Model model, @PageableDefault(size = 5, sort = "id", direction = Sort.Direction.DESC) Pageable pageable) { List boardList = boardService.getBoardList(pageable); Integer[] pageList = boardService.getPageList(pageable); model.addAttribute("postList", boardList); model.addAtt..
글 검색 기능을 추가해보겠습니다. 제목,작성자,내용에 검색어가 포함된 글들만 리스트로 보여줄 예정입니다. BoardController @GetMapping("/board/search") public String search(@RequestParam(value="keyword") String keyword, Model model) { model.addAttribute("postList", boardService.searchPosts(keyword)); return "board/list.html"; } 여러분도 아시다시피 GET방식은 'localhost:8080?keyword=abcd' 로 값이 넘어오죠. REST API처럼 구현하고 싶은데 저는 실패를 했습니다.. 아무튼 저렇게 넘어온 값은 @Request..
오늘의 포스팅은 굉장히 짧을 예정입니다. 진짜 막상 마음을 먹으면 금방 뚝딱하고 만들 수 있는 파트거든요. BoardController @DeleteMapping("/board/post/{id}") public String delete(@PathVariable Long id) { boardService.delete(id); return "redirect:/board/list"; } controller에서는 service에게 넘겨주기만 합니다. BoardService @Transactional public void delete(Long id){ Board board = boardRepository.findById(id).orElseThrow(()->new IllegalArgumentException("해당..