start.spring.io라는 웹 사이트를 사용해서 간단하게 Spring 프로젝트를 생성할 수 있습니다.Project : MavenLanguage : JavaSpring Boot : 3.x.xGroup : soowan.study.springbootArtifact :
프로젝트가 제대로 작동하는지 확인하기 위해 간한단 Controller를 만들어보겠습니다.@ResponseBody - 메소드가 반환하는 값을 View가 아닌 HTTP 응답 본문을 그대로 반환합니다. 만약 Java객체를 HTTP 응답 본문으로 반환할 때, 해당 객체를 적정
이번 기록은 JSP를 사용해서 뷰를 반환해보겠습니다.일반적으로 JSP는 특정한 폴더 안에서 만들어야 합니다.Spring Boot에 의해 정의되는 경로에 폴더를 만들어야 제대로 작동을 합니다.src/main/resources/META-INF/resources/WEB-IN
HTTP 요청의 쿼리 스트링의 파라미터나 폼 데이터쿼리스트링 : URL의 일부, 웹 서버에 보낼 추가 파라미터를 포함합니다. URL 끝에 물음표(?) 다음에 위치하며 key=value 형태입니다. 여러 개의 파라미터가 있는 경우에는 앰퍼샌드(&)로 구분됩니다. 쿼리파라

개발자들은 문제가 발생했을 때 로그를 보며 많은 시간을 보냅니다. 그러므로 로그는 문제를 해결할 수 있는 단서를 가지고 있기 때문에 매우 중요합니다.로깅에는 몇 가지 단계가 있습니다.TRACE : 상세한 로그 레벨로, 애플리케이션의 실행 흐름을 디버깅하기 위해 사용됩니

이번에는 JSP를 사용해서 로그인 페이지를 만들어보겠습니다.JSP 표현식을 사용해서 파라미터로 받은 name, password를 표시해 봅니다.제대로 값을 받아오는지 확인하는 용도입니다. 실제 서비스에서는 password는 절대 표시하면 안됩니다.Login(GET) :

LoginController의 gotoWelcomePage()에 로그인 인증 로직을 구현합니다.단일책임 원칙을 따르기 위해 별도의 인증 클래스를 만들겠습니다.LoginController.class 와 같은 패키지에 만들어줍니다.파라미터로 넘어온 로그인 아이디와 패스워드
idusernamedescriptiontargetDatedone할 일을 저장할 객체를 만들겠습니다.간단하게 id와 이름, 설명, 완료 시점, 완료 유무를 속성으로 가지는 객체입니다.객체를 만들었으니 서비스를 만들어서 사용해보겠습니다.DB를 사용하기 전에 간단하게 Lis

Todo 리스트와 TodoController를 만들어보겠습니다.먼저 TodoController 부터 만들겠습니다.원래는 todoService.findByUsername()에 하드코딩을 하면 안되지만 지금은 하드코딩을 하고 나중에 변경하겠습니다.이번에는 todo-list

JSP(JavaServer Pages) 파일에서 HTML 태그처럼 사용할 수 있는 태그 라이브러리입니다.라이브러리를 사용하면 JSP 파일 내에서 Java 코드를 직접 작성하지 않고도 반복문, 조건문, 국제화(i18n) 지원, XML 파일 처리 등의 작업을 태그 형식으로

이전의 결과물을 보면 아주 간단한 형태를 취하고 있습니다. 이번에는 위 결과물에 CSS를 입혀보겠습니다.두 개의 의존성을 추가해 줍니다.jquery와 Bootstrap을 연결 시켜줍니다.이전의 실행결과와 조금 다른 걸 볼 수 있습니다.다음 포스팅에서는 더욱 변화된 실행

listTodo.jsp 페이지에 Bootstrap을 적용해보겠습니다.<table class=”table”></table> : HTML 테이블 요소에 스타일과 레이아웃을 적용하는 역할을 합니다.<div class=”container”></div> :
이번에는 할 일을 추가하는 todo.jsp페이지를 만들겠습니다.할 일을 추가하는 페이지입니다.할 일 목록을 보여주는 페이지를 반환하는 showNewTodoPage()와 데이터를 요청 했을 때 응답할 addNewTodo()를 추가합니다.
TodoController로 넘어온 요청을 저장하기 위해 TodoService를 개선해보겠습니다.id를 숫자로 주지 않고 1씩 올라가게 ++todoCount로 대체합니다.addTodo()를 사용해서 새로운 할 일을 저장합니다.addTodo() : 요청으로 받아온 사용자
이번 포스팅에서는 Spring Boot Validation을 정리하겠습니다.간단하게 프론트에서 검증을 할 수 있는 법이 있습니다.required=”required”를 사용하면 입력 없이 요청을 하려는 경우 입력창이 비어있으면 안된다는 경고창을 띄워줍니다.하지만 이 방법

먼저 listTodos.jsp에 삭제 버튼을 추가합니다.id를 사용해서 게시물을 구분하고 쿼리스트링을 사용해서 id를 전달합니다.TodoService에 삭제 관련 로직을 작성합니다.TodoController에 deleteById()를 추가합니다.DELETE 2 버튼으로

listTodos.jsp에 업데이트 버튼 추가delete와 똑같이 id를 쿼리파라미터로 보냅니다.전달받은 쿼리스트링을 TodoController에서 잡아서 showUpdateTodoPage()에서 사용합니다.업데이트할 객체의 id를 받아서 TodoService의 fin
저번 포스팅에서 Todo 업데이트 구현을 해보았는데요, description의 내용이 로딩은 잘 되었으나 내용을 바꿔서 저장을 하면 저장이 안되었을 겁니다. 이번에는 저장이 안되는 문제를 고쳐보겠습니다.TodoService에 할 일을 저장하는 updateTodo()를

todo.jsp에 날짜를 설정하는 태그를 추가합니다.description <fieldset>을 복사해서 붙여 넣고 path를 targetDate로 바꾸겠습니다.todo.jsp에서 보낸 요청을 받아서 날짜를 바꿔야 하기 때문에 TodoController의 addNe

todo.jsp와 listTodos.jsp에서 많은 부분이 중복되는 걸 알 수 있습니다. 이번에는 중복을 제거하기위해 JSP 프래그먼트라는 개념을 배우고 사용하겠습니다.재사용 가능한 코드 조각을 의미합니다. 프래그먼트를 사용하면 JSP 페이지의 특정 부분을 분리하여 독

Spring 기반 애플리케이션에서 보안과 인증을 담당하는 강력한 프레임워크입니다. Spring Security를 사용하면 사용자 인증, 권한 부여, 보안 설정 등을 손쉽게 구현할 수 있습니다.Spring Security를 사용하기 위해 LoginController를 수
Spring Security 설정을 하기 위해 security 폴더에 SpringSecurityConfiguration.class를 만들겠습니다.
먼저 welcomeController.class 부터 시작하겠습니다.Spring Security에서 넘어온 username을 받아서 model.put의 파라미터로 넘겨줍니다.WelcomController 수정을 완료했으니 이번에는 TodoController를 수정하겠습

새로운 사용자를 등록하기 위해서는 SpringSecurityConfiguration 설정을 변경해야합니다.먼저 userDetails 코드를 메소드로 만들겠습니다.createNewUser()를 사용해서 새로운 유저를 추가합니다.tester2로 로그인을 하면 투두 리스트가

H2데이터베이스로 접속을 해보면 실행할 때마다 url이 변하는 것을 알 수 있습니다.url이 매번 변하면 접속할 때 번거롭기 때문에 application.properties를 사용해서 고정 시키겠습니다.데이터베이스의 url이 변경된 걸 확인할 수 있습니다.
H2 데이터베이스를 사용하기 위해서 Spring Security에 몇 가지 설정을 해줘야합니다.Spring Security에 별다른 설정을 하지 않는다면 기본 값으로 두 가지가 설정됩니다.모든 URL이 보호됩니다.승인되지 않은 요청에 대해서는 로그인 양식이 표시됩니다.

먼저 todo class에 @Entity를 붙여서 테이블과 매핑을 해줍니다. @Id @GeneratedValue로 아이디를 지정합니다.data.sql 파일을 만들고 기본데이터를 삽입합니다.data.sql은 엔티티가 생성되기 전에 실행이 되기 때문에 application

기존의 TodoController의 @Controller는 주석처리합니다.TodoController와 같은 패키지에 생성합니다.username을 파라미터 받아서 검색하는 메소드를 정의합니다.JPA Query Methods :: Spring Data JPAQuery Cr
TodoControllerJpa에서 todoService를 사용하는 메서드를 수정하겠습니다.listAllTodos, addNewTodo, deleteTodo, showUpdateTodoPage, updateTodotodoService를 사용할 때보다 더 간편해진 걸 확

지금까지는 H2 데이터베이스를 사용해서 인메모리 형식으로 간단하게 데이터를 저장했습니다.사실 Spring Data JPA를 사용하면 데이터베이스 변경을 어렵지 않게 할 수 있습니다. 지금부터는 H2 데이터베이스를 MySQL로 변경해보겠습니다.MySQL은 Docker를
UsersPostsUser: id, name, birthDatePost: id, descriptionREST API 설계에 앞서 HTTP Method에 대해 간략하게 알아보겠습니다.GET - 자원을 조회할 때 사용합니다.POST - 자원을 생성할 때 사용합니다.PUT
먼저 User, Post를 저장하기 위한 Bean을 생성하겠습니다.현재는 가볍게 List에 데이터를 저장하고 조회하기 위해서 DAO를 사용하겠습니다.지금은 3개의 데이터만 저장하고 전체 조회하는 메소드를 만들겠습니다.

전체조회 기능 만들기findOne()retrieveUser()id 1로 조회가 잘 됩니다. 성공입니다!

UserResource에 POST 관련 URL을 작성합니다.createUser() 추가현재는 데이터베이스를 사용하지 않아 id값을 usersCount를 사용해서 카운트합니다.save() 추가Postman을 사용해서 데이터를 추가하겠습니다.요청이 save()를 타고 제대

지금까지 우리는 REST API를 따르며 URL을 구현했습니다. 이때 중요한점 중에 하나는 정확한 응답 상태를 반환하는 것입니다.예를 들어 입력한 리소스가 존재하지 않았을 때는 응답코드 404를 반환하는 것처럼 말입니다.REST API에 대한 내용은 아래 블로그에 정리

지금까지는 잘못된 회원을 조회했을 때 500상태 코드로 에러가 보여졌습니다.500번대 에러가 사용자에게 바로 보이는 것은 좋지 않습니다. 잘못된 회원을 조회한 것이라면 400번 에러가 보여야합니다. 응답코드에 대해 자세히 알고 싶다면 참고해주세요.HTTP Status
저번 기록에서는 Not Found 에러처리에 대해서 알아보았습니다.애플리케이션을 만들다 보면 여러 에러를 만나게 되어있습니다.그만큼 에러를 처리하는 과정은 매우 중요합니다. 이번 기록에서는 예외 발생 시 반환하는 응답의 구조를 바꿔보려고 합니다.src/main/java

사용자를 삭제하기 위해서 먼저 삭제 기능을 만들겠습니다.deleteById()removeIf: 컬렉션 클래스들에서 제공되는 메서드로, 주어진 조건에 해당하는 요소들을 컬렉션에서 제거하는 기능을 합니다.UserResource에서 삭제기능을 담당하는 메서드를 생성합니다.d

이번에는 잘못된 데이터 요청이 왔을 경우 검증을 하는 법을 알아보겠습니다.예를들어, 이름이 없고 현재 2024년이지만 생일이 2030년인 사람의 데이터를 생성하려고 할 때 생성이 되면 안되겠죠?? 이런 경우를 대비해서 정확한 데이터의 요청이 들어오는지 검증하는 법을 배
REST API를 만들었다면 문서화를 해야합니다. API 스펙에 대한 명시를 해야합니다.그렇다면, REST API에 대한 문서를 어떻게 생성할 수 있을까요?이번 시간에는 Open API와 Swagger에 대해 알아보겠습니다.지금까지는 JSON으로 데이터를 처리하고 있었
이번 기록에서는 REST API 문서를 집중적으로 다뤄보겠습니다.REST API를 제공하는 쪽에서는 사용자가 쉽게 API를 사용할 수 있도록 해야합니다.Resources: 노출되고 있는 여러 리소스가 무엇인지 알아야 합니다.Action: 수행되는 여러 작업에 대해서도

REST API 문서 자동화를 위해 의존성을 추가하겠습니다.Swagger가 제로 작동하는지 확인하겠습니다.http://localhost:8080/swagger-ui/index.html를 통해 접근할 수 있습니다.앞에서 작성한 URI가 정상적으로 보입니다. /v
동일한 Resource - 동일한 URI예를 들어 /users 라는 URI가 있다고 할때 JSON으로 응답을 할 수도 있고, XML로 응답을 할수도 있습니다.또는 다른 언어로 된 응답을 기대할 수도 있습니다. 한국어, 영어, 일본어 등등이렇게 하나의 URI를 가지고

만약 여러분의 제품을 전세계 사람들이 사용한다고 했을 때 서로 다른 언어를 사용하는 사용자들에게 맞는 언어를 제공하기 위해서 어떻게 할까요?이때, Internationalization(i18n) = 국제화를 사용해야 합니다.국제화를 처리할 때마다 Accept-Lang

클라이언트는 서버로부터 받은 응답에 포함된 하이퍼미디어 링크를 통해 상태 전이를 수행할 수 있어야 합니다. 즉, 클라이언트는 서버로부터 받은 응답을 통해 애플리케이션의 상태를 파악하고 상호작용할 수 있는 링크 정보를 동적으로 받아들이게 됩니다.REST API를 향상하여

REST API 반환시 커스터마이징해서 응답하는 법을 알아보겠습니다.만약, 필드의 이름을 그대로 내보내는 것이 아니라 다른 이름으로 내보내고 싶다면?@JsonProperty: JSON 프로퍼티의 이름을 변경할 수 있습니다.응답 프로퍼티가 @JsonProperty로 설정

정적 필터링에서는 @JsonIgnore를 붙인 필드는 모든 REST API에서 필터링이 되었습니다.하지만, 같은 빈이라도 REST API에 따라 다른 속성을 반환하고 싶을 수도 있을겁니다.동적 필터링을 사용하면 REST API마나 다른 속성을 반환할 수 있습니다.바로

스프링 부트 애플리케이션을 모니터링하고 관리하기 위한 기능을 제공하는 라이브러리애플리케이션 상태 엔드포인트매트릭 수집환경 설정 정보스레드 덤프엔드포인트 보안스프링 부트 애플리케이션에 Actuator를 추가하면 이러한 기능을 손쉽게 활용할 수 있습니다. 이를 통해 애플리

JPA를 사용해서 User 엔티티를 관리하기 위해 User 클래스를 수정합니다.JPA가 관리하는 Entity라는 것을 명시하기 위해 @Entity 추가아이디를 지정하기 위해 @Id, @GeneratedValue 추가DB에 데이터가 하나도 없으니 초기 데이터를 생성하겠습
JPA를 사용해서 데이터베이스와 통신하기 위해 UserResource를 복사해서 UserJpaResource를 만들겠습니다.UserRepository를 사용합니다.service → repositoy로 변경합니다.
User 엔티티와 일대다관계를 맺을 Post 엔티티를 생성합니다.아이디설명User 객체한 사람이 여러 포스트 작성이 가능하기 때문에 @ManyToOne을 사용합니다.중요한점은 xToOne은 기본적으로 fetch가 EAGER로 설정되어있기 때문에 예상하지 못한 쿼리를 발
UserJpaResource에 특정 user의 모든 게물을 가져오는 코드를 작성하겠습니다.retrievePostsForUser() 추가findById를 통해서 user를 조회하고 user가 없다면 에러를 발생시킵니다.있다면 찾아온 user의 모든 post를 반환합니다.
게시물을 등록하는 코드를 작성하겠습니다.게시물 전체조회와 마찬가지로 UserJpaResource에 작성하겠습니다.createPostForUser()user가 없다면 에러를 발생시킵니다.있다면 user를 post 엔티티에 저장합니다.저장된 post 엔티티의 아이디를 현재

스프링 시큐리티를 사용하기 위해 pom.xml에 의존성을 추가합니다.애플리케이션을 재실행 하시면 콘솔창에 비밀번호가 출력되는걸 볼 수 있습니다.URI를 통해서 접속을 하려고 해도 login 페이지로 바로 보내지는걸 알 수 있습니다.이는 스프링이 인증이되지 않은 사용자의

Spring Security 기본인증에서는 스프링 시큐리티가 기본으로 제공해주는 보안 필터를 사용했습니다. 리소스에 접근을 하기 위해서는 무조건 로그인을 했어야 했습니다.이번에는 Spring Security FilterChain을 커스텀 해서 사용해 보겠습니다.stud