본문 바로가기

Development/Spring Boot13

대강 살펴보는 자바부터 스프링부트까지의 역사 (자바, CGI, Servlet, DispatherServlet, JSP, Thymeleaf, J2EE, EJB, POJO, Hibernate, JPA, Spring Data JPA, Spring, Spring Boot) 사내 세미나로 진행한 내용을 발표 스크립트와 함께 작성한 내용 입니다. 많은 내용들을 축약하다보니 다소 정확하지 않은 내용이 포함되어 있을 수 있습니다. 설명의 흐름을 위해 연도 상관 없이 넣은 설명들이 있습니다. 보통 이런 애들은 연도를 따로 쓰지 않았습니다. 1991년 제임스 고슬링이 만들었습니다. 당시 썬 마이크로시스템즈 다녔고, 2010년에 오라클에 썬마이크로시스템즈가 인수 합병되었습니다. 그래서 요즘 오라클 사이트 들어가서 jdk 받거나 하게 된 겁니다. PHP, ASP, 펄 스크립트, C, 파이썬 등으로 CGI를 구현할 수 있습니다. 자바로도 구현 가능합니다. 일종의 스펙이므로 언어 무관하게 구현 가능합니다. 다만 단점은 요청 마다 새로운 프로세스를 생성하고, DB connection을 새로 .. 2024. 4. 18.
스프링(부트)에서 final이 아닌 필드(인스턴스 변수, 클래스 변수)가 있으면 안됩니다. 목차 이 내용은 당연한 것 같으면서도 은근히 코드리뷰할 때나 얘기할 때 한번씩 보이는 것 같아서 글로 적어보게 되었다. 개인 생각을 적은것이니 다른 의견 혹은 틀린 부분이 있으면 알려주세요. 제목을 좀 더 구체적으로 적은 이 글의 결론은 다음과 같다. 결론 스프링 혹은 스프링부트로 만든 프로젝트에서 @Component, @Controller, @Service, @Repository 와 같이 스프링 컨테이너에 등록되는 클래스에 Bean 주입 이외 용도의 필드(인스턴스 변수, 클래스 변수)가 있으면 안됩니다. 혹시 들어가야 한다면 final이어야 합니다. final 이더라도 그게 객체라면 불변임이 보장되는게 좋습니다. 물론 POJO로 된 도메인 계층 등 스프링 컨테이너에 안들어가는 애들은 상관없습니다. PO.. 2024. 4. 4.
Map에 mybatis의 map-underscore-to-camel-case가 안먹히는 이유를 알아보자 관련된 질문을 받아 이유를 찾아보기 위해 mybatis 소스를 까보게 되었다. 찾아본김에 혹시 궁금할 사람도 있을 것 같아 어느 부분에 의해 Map을 사용 시 map-underscore-to-camel-case 옵션이 안먹히는지 공유하려고 한다. map-underscore-to-camel-case 사용 이유 테이블의 칼럼명이 phone_number 이런식으로 언더바가 들어간 형태로 되어 있는 경우가 있다. 이걸 받기 위해 dto의 변수도 'String phone_number;' 처럼 언더바가 들어간 형태로 가자니 자바의 기본적인 카멜 케이스 형태랑 안맞아서 멋없다. setter도 'setPHONE_NUMBER' 이런식으로 들어가야하니 더더욱 멋없다. 그래서 String phoneNumber; / setP.. 2024. 2. 21.
Spring Initializr 에서 선택한 자바 버전은 어떤 의미일까? 목차 Spring Initializr는 자바 버전을 선택할 수 있다! 근데 알다시피 스프링 부트 3.0 부터는 자바 17 이상을 써야 하는데, Spring Initializr는 아무튼 버튼은 그대로 표출되어 있다. 이와 관련된 에러는 '스프링부트 3.0.0 프로젝트 생성시 에러 해결법' 에서 볼 수 있다. 그럼 궁금한건 그럼 저 "자바 버전을 선택하는게 어떤 의미가 있나?" 라는 부분이었다. 자바 버전을 변경하면 바뀌는 부분 스프링부트 2.7.X 버전이하일 경우 자바 버전을 바꾸면 변경되는 부분은 build.gradle의 sourceCompatibility 부분이다. 그리고 스프링부트 3.0.x 버전의 경우, 분명 3.0.0 초창기에는 Spring Initializr로 생성 시 17버전이 아니라면 저 부.. 2023. 4. 3.
스프링부트 헥사고날 아키텍쳐 코드 구조 스터디 메인 페이지 * 헥사고날 아키텍쳐를 이제 공부 시작해보는거라 틀린 내용이 있을 수 있습니다. 헥사고날 아키텍쳐 스터디를 시작했는데, 책(만들면서 배우는 헥사고날 아키텍처 설계와 구현)의 개념들이 초반부터 좀 어려웠다. 구체적인 코드를 먼저 짜보지 않고 설명만 보면 너무 이해가 더딜 것 같았다. 내 경우에 스프링부트로 프로젝트를 만들 때 사용할 아키텍쳐를 공부해보기 위해 시작한거라 책에서 설명한 헥사고날 구조가 스프링부트에 어떤식으로 적용될지부터 감이 와야 이후 내용을 진행할 수 있을거라 생각했다. 그래서 책의 내용을 보고 예상되는 코드 구조를 한번 짜봤다. 현업에서 현재 헥사고날 아키텍쳐를 적용중인 분께 여쭤보니 다행히 코드 구조 자체는 헥사고날 구조가 맞다고 들어서 만들어본 코드를 기준으로 헥사.. 2023. 2. 17.
스프링부트 3.0이상 Spring Security 기본 세팅 (스프링 시큐리티) 목차 [수정 사항] 2023-03-29 : 커스텀 어노테이션 적용하는 부분에서 소스코드에 잘못 들어간 코드가 있어서 삭제 2024-01-12 : SpringSecurityConfig 클래스의 코드에 어노테이션 빠져 있던 부분 추가 1. 시작하기 전에 1.1 설정 이해 보다는 당장 시큐리티 설정 복붙이 필요한 분들에게 이하 글에서는 import 를 제외하고 작성했고, 코드들이 글에 작성되어 있다보니 완전 초보라면 이해하기 힘들 것 같습니다. 또는 당장 급하게 복붙할 스프링 시큐리티 기본 세팅이 된 프로젝트를 찾는 경우도 있을겁니다. 그러니 우선 예시 프로젝트를 첨부합니다. 이 글은 이하의 예시 프로젝트를 만들기 위해 세팅하는 과정을 다룹니다. - 프로젝트 (스프링부트 3.0.2 기준) : github (m.. 2023. 2. 10.
스프링 부트 2.0에서 3.0 스프링 시큐리티 마이그레이션 (변경점) 목차 스프링 부트 3.0 부터 스프링 시큐리티 6.0.0 이상의 버전이 적용되었습니다. 스프링 부트 2.7.8 까지는 deprecated는 되었더라도 기존 설정대로 대부분 사용 가능했으나, 스프링 부트 3.0 부터는 아예 삭제된 부분들이 있어서 마이그레이션 시 주의할 부분(변경점)에 대해 다룹니다. - 스프링 부트 2.7 이하 스프링 시큐리티 기본 세팅 : 링크 - 스프링 부트 3.0 이상 스프링 시큐리티 기본 세팅 : 작성중 0. 스프링 시큐리티 설정 마이그레이션 예시 완전히 동일한 세팅은 아니지만, 스프링 부트 2.6 기반으로 작성된 기본 세팅 코드와 스프링 부트 3.0 기반으로 작성된 기본 세팅 코드 입니다. 이하에 나올 변경점들이 적용되어 있는걸 코드로 볼 수 있습니다.(각각 위 2.7 이하 기본.. 2023. 2. 9.
스프링부트 3.0.0 프로젝트 생성시 에러 해결법 (인텔리제이) 스터디용 프로젝트 하나 파는김에 새로나온 스프링부트 3.0.0으로 해보려 했다. 그런데 아래와 같은 에러가 발생했다. A problem occurred configuring root project 'java-test-practice'. > Could not resolve all files for configuration ':classpath'. > Could not resolve org.springframework.boot:spring-boot-gradle-plugin:3.0.0. Required by: project : > org.springframework.boot:org.springframework.boot.gradle.plugin:3.0.0 ... 얼핏 스프링부트 3.0.0 변경점 찾아봤던 것에서.. 2022. 12. 15.
스프링부트 MyBatis에서 파라미터 여러개 넘기기 (parameterType) 사실 Map 형태로 되어있는 프로젝트라면 모든 Map들을 합쳐서 보내면 되니 별 문제가 없다. 내 경우엔 사용자로 부터 컨트롤러로 들어오는 dto가 여러 종류일 때, 그 종류와 상관없이 동일한 형태로(각 dto에 상응하는 entity를 하나씩 만들고 싶지 않았다) MyBatis에 보내고 싶었다. 또한 해당 요청의 uri도 자동으로 넣어졌으면 좋겠고, JWT+스프링 시큐리티로 AuthenticationPrincipal에 넣어둔 인증된 사용자의 id가 있는 UserInfo도 자동으로 들어가게 하고 싶었다. 즉, 여러 uri를 가지는 컨트롤러들어 있고 각 컨트롤러마다 사용자로부터 받는 dto 클래스가 다르다. 이 때 유저정보, uri, dto를 한꺼번에 물고 MyBatis에 보내고 싶었다. 그래서 다음과 같이.. 2022. 2. 18.
스프링부트 Swagger UI 3.0.0 적용 방법 - 스프링부트 2.2 이상 (Spring Boot Swagger UI) Spring Boot Swagger 3.0.0 적용하기 (스프링부트 2.2 이상 필요) Swagger ? 간단히 말하자면 API 문서를 자동으로 만들어주는 라이브러리임 https://swagger.io/ 예시는 스웨거의 Live Demo 참조 (https://petstore.swagger.io/) 완전 기본적인 적용방법에 대해서만 다룸. 단순 문서 뿐 아니라 API를 문서내에서 parameter를 넣어가며 바로바로 실행 해볼 수 있음. rest api 제작 후 따로 테스트 페이지나 postman으로 실행해보는 대신 swagger 문서 만들어서 실행 가능. 복잡하지 않은 시스템이라면 rest api 서버에 swagger를 적용시켜두고, 해당 api를 호출하는 작업자에게 뭐 복잡하게 설명하고 문서 만들 것 .. 2021. 12. 27.