2026. 4. 8. 12:50ㆍ2026 상반기 전공과목 공부/Java 프레임워크

RestfulController 클래스 생성

package indusw.sba.admin2024001910a.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("api/v1")
public class RestfulController {
@GetMapping("/members")
public String gotMemberList() {
return "<h1>Member List</h1>"; //MVC-view, Restful-response
}
}

HomeController

package indusw.sba.admin2024001910a.controller;
import jakarta.annotation.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HomeController {
@GetMapping("/") // 최상위 디렉토리
public String goHome(@Nullable @RequestParam("p") String p, Model model ) {
model.addAttribute("attrname", p); // ?p=*** -> ?p=attrname
//index.html에 attrname 이름으로 p String 객체 값을 model 객체에 저장
return "redirect:/main/index"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
@GetMapping("/main/index") // 최상위 디렉토리
public String goIndex() {
return "./main/index"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
@GetMapping("/misc/cards") // 최상위 디렉토리
public String goCards(){
return "./cards"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
}
바로 main/index로 연결됨

1. redirect: 사용 시 발생하는 일
코드에서 return "redirect:/main/index"; 부분을 보면, 단순히 화면을 보여주는 것이 아니라 브라우저에게 새로운 주소로 다시 접속하라고 명령하는 것입니다.
- 동작 방식: 사용자가 / 주소로 접속하면, 서버는 302 상태 코드와 함께 "이제 /main/index로 가세요"라는 응답을 보냅니다. 브라우저는 이 메시지를 받자마자 자동으로 주소창을 바꾸고 /main/index에 해당하는 goIndex() 메서드를 다시 호출합니다.
- 데이터 유실 문제 (중요!): * 현재 코드에서 model.addAttribute("attrname", p);를 사용하셨는데, redirect:를 하면 이 데이터는 사라집니다.
- Model 객체는 딱 한 번의 요청(Request) 동안만 유지됩니다. 리다이렉트는 새로운 요청을 만드는 것이기 때문에, goIndex() 단계에서는 attrname을 찾을 수 없게 됩니다.
- 해결책: 데이터를 유지하고 싶다면 RedirectAttributes를 사용하여 쿼리 스트링으로 넘기거나, 세션을 사용해야 합니다.
2. @Nullable 사용 시 발생하는 일
@Nullable @RequestParam("p") String p 부분은 파라미터 p가 주소창에 없어도 에러를 내지 말라는 뜻입니다.
- 기본 동작: 보통 @RequestParam은 해당 파라미터가 없으면 400 Bad Request 에러를 발생시킵니다.
- @Nullable의 효과: * localhost:8080/ 처럼 뒤에 아무것도 붙이지 않고 접속해도 에러 없이 실행됩니다. 이때 변수 p에는 null이 들어갑니다.
- Spring 프레임워크 수준에서 "이 값은 비어있을 수 있음"을 인지하고 안전하게 처리해 줍니다.
- 참고: @RequestParam(value="p", required=false)와 사실상 동일한 역할을 합니다.
package indusw.sba.admin2024001910a.controller;
import jakarta.annotation.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HomeController {
@GetMapping("/") // 최상위 디렉토리
public String goHome() {
return "redirect:/main/index"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
@GetMapping("/main/index") // 최상위 디렉토리
public String goIndex(@Nullable @RequestParam("p") String p, Model model ) {
model.addAttribute("attrname", p); // ?p=*** -> ?p=attrname
//index.html에 attrname 이름으로 p String 객체 값을 model 객체에 저장
return "./main/index"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
@GetMapping("/misc/cards") // 최상위 디렉토리
public String goCards(){
return "./cards"; // .html 접미사 (suffix) 를 자동 추가, index.html에서는 attrname으로 접근
}
}
위와 같이 코드를 변경
1. 왜 goIndex에서 받나요?
**리다이렉트(redirect:)**를 하면 이전 메서드(goHome)에서 넣었던 데이터는 전부 삭제.
그래서 데이터를 화면에 보여주려면, 최종 목적지인 goIndex에서 직접 값을 받아야 함
2. @Nullable은 왜 쓰나요?
주소창에 ?p=...가 없을 때 에러가 나는 걸 막기 위해서
- 있으면: 그 값을 가져옴
- 없으면: 에러 대신 null로 처리해서 통과
한 줄 요약
"리다이렉트하면 데이터가 증발하니까, 실제 화면을 띄우는 goIndex가
직접 파라미터를 (없어도 에러 안 나게 @Nullable로) 받아서 모델에 다시 넣어주는 구조
-->> @Nullable을 주면 model객체가 사라지기 때문에 아래쪽에 goindex에 직접 p에 값을 넣었을때 저장하게 하는거


표시된 부분을 주석처리 하고

이부분이 결국 없는건데
@Nullable을 사용해서 그냥 Null로 처리해버림
@GetMapping("/") // 최상위 디렉토리
//@RequestMapping(value="/", method={RequestMethod.GET}) = @GetMapping("/") 이게 더 편하기 때문에 지금은 이 코드를 쓴다
@RequestMapping(value="/", method={RequestMethod.GET})
설명
- 의미: 웹 브라우저에서 사이트의 **메인 주소(/)**로 접속했을 때, 해당 메서드를 실행하라는 뜻입니다.
- HTTP Method: GET 방식(주로 페이지를 요청할 때 사용)으로 들어오는 요청만 처리합니다.
- 더 쉬운 표현: 최신 Spring 버전에서는 아래와 같이 더 짧게 쓸 수 있습니다.
-
Java
@GetMapping("/")
디렉토리 변경

ErrorController 클래스 생성

package indusw.sba.admin2024001910a.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/errors")
public class ErrorController {
@GetMapping("/404")
public String get404() {
return "../errors/404"; // view : /errors/404.html 지정
}
}
ProductController 클래스를 만듬

package indusw.sba.admin2024001910a.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/products")
public class ProductController {
@GetMapping("/list")
public String getProducts() { // url : localhost:8000/products/list
return "../products/list";
}
}
meber에서 list.html을 복사해서 products안에 붙여넣음

HomeController의 사진의 부분을 ProductController로 옮김


@GetMapping("/cards") // 최상위 디렉토리
public String goCards(){
return "../products/cards";
// ./cards 를 지정하면 현재가 /products/ 이므로 접근 가능
}

MemberController 클래스 만듬
사진에 보이는 패키지 만들고
Member 클래스 만듬


package indusw.sba.admin2024001910a.domain;
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@ToString
public class Member {
private long id;
private String name;
private String email;
private String pw;
}

spring.thymeleaf.cache=false
캐쉬를 저장하지 않아서 빠른 처리속도가 가능
(서버를 재시작하지 않고도 브라우저 새로고침만으로 변경 사항을 바로 확인하게 해주는 기능)
왜 사용하나요? (개발 편의성)
실시간 확인: 화면 UI 작업을 할 때 HTML이나 CSS 구조를 바꾼 뒤,
서버 재시작 기다림 없이 **F5(새로고침)**만 누르면 바로 수정본이 뜸
개발 환경에서만 사용: 개발할 때는 편하지만, 실제 서비스(운영 환경)에서는 반드시 true로 돌려놓거나 이 옵션을 제거해야 함
매번 파일을 새로 읽어오면 서버 부하가 커지고 웹사이트 속도가 현저히 느려지기 때문
------
server.port=9000
포트번호를 8080에서 9000으로 바꿈
Member 클래스에 아래 코드 추가
개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean 인스턴스로 생성할 때 사용되는 어노테이션
라이브러리 객체를 반환하는 메소드를 정의
@Bean(name="identifier")
public Member getMember() {
return new Member();
}


키 발급 받아오기

https://www.kobis.or.kr/kobisopenapi/homepg/apiservice/searchServiceInfo.do
영화진흥위원회 오픈API
제공서비스 영화관입장권통합전산망이 제공하는 오픈API서비스 모음입니다. 사용 가능한 서비스를 확인하고 서비스별 인터페이스 정보를 조회합니다.
www.kobis.or.kr
시험문제로 나올 수도?
'2026 상반기 전공과목 공부 > Java 프레임워크' 카테고리의 다른 글
| 자바 프레임 워크 9주차 / DI (0) | 2026.04.29 |
|---|---|
| 자바 프레임 워크 7,8주차 (0) | 2026.04.22 |
| 자바 프레임 워크 (0) | 2026.04.01 |
| 자바 프레임워크 2주차 (0) | 2026.03.11 |
| 자바 프레임워크 1주 (0) | 2026.03.04 |