| Controller
컨트롤러는 쉽게 회사 프론트데스크 같은 느낌이랄까... 징검다리역할
사용자의 요청이 진입하는 지점이며 요청에 따라 어떤 처리를 할지 결정을 Service에 넘겨줍니다. 그후 Service에서 실질적으로 처리한 내용을 받아 View에게 넘겨주는 역할을 한다
실제 프로젝트에서 사용했었던 controller로 설명해보겠다
보면 page 컨트롤러 랑 api 컨트롤러로 나뉘는걸 볼수있다
page controller는 HTML과 같은 뷰를 불러와 전달해주는 역할을 하고
api controller는 Entity,Repository,Service 등을 통해 데이터를 읽고 쓰고 수정하고 삭제한다.
| page controller
1.디렉터리 생성
page controller는 사용자에게 보여지는 페이지들을 반환시켜주는 컨트롤러이다.
주소쳤을때 보여지는 HTML을 반환해준다고 보면된다.
먼저 controller 디렉터리를 만들어준다
controller 디렉터리 안에 api디렉터리랑 page 디렉터리도 만들어준다.
모든 디렉터리는 첫 하위디렉터리 생성시
이런식으로 controller.api 점 으로 표현이 되는데
이 상태에서 똑같은 방식으로 형제 디렉터리를 생성하려고하면
api디렉터리와 형제가 아닌 api디렉터리 안(하위)에 생성된다
이때는 탐색창 모드를 Project files 모드로 변경하여 생성하면된다
그럼 이렇게 controller 안에 생성된 api 디렉터리가 보인다
이곳에서 형제 디렉터리를 만들면 된다.
controller디렉터리를 우클릭하여 하위에 page디렉터리를 만들어보겠다
그리고 다시 탐색모드를 Project모드로 변경시켜준다
그럼 이렇게 controller안에 api, page 가 나란하게 있는것을 볼 수 있다.
2.controller 생성
page디렉터리에서 이제 실제 page controller 파일을 생성해보겠다
page에서 우클릭-new-Java Class
이름은 PageController 라고 쓰고
Class 선택하고 생성한다
참고로 클래스 명을 작성할때는 규칙이 있는데
첫 단어를 대문자로 적는 파스칼 표기법을 사용한다
추가적으로 다른 표기법도 소개하겠다. 앞으로 다 쓸거라 꼭 알아둬야함
1 카멜 표기법
- "camelCase"
- "단봉낙타" 표기법
- 각 단어의 첫문자를 대문자로 표기하고 붙여쓰되, 맨처음 문자는 소문자로 표기함
- 띄어쓰기 대신 대문자로 단어를 구분하는 표기 방식
- 예시: backgroundColor, typeName, iPhone
2 파스칼 표기법
- "PascalCase"
- 첫 단어를 대문자로 시작하는 표기법
- 예시: BackgroundColor, TypeName, PowerPoint
3 스네이크 표기법
- snake case, snake_case스네이크 표기법, 스네이크 케이스, 뱀 표기법,
- 단어를 밑줄문자로 구분하는 표기법
- 예시: background_color, type_name
제일처음은 이상태이다.
이제 어노테이션이라는 것을 달아야한다.
Annotation 이란?
Annotation(@)은 사전적 의미로는 주석이라는 뜻입니다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술입니다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다.
기본적으로 어노테이션을 사용하는 순서는 다음과 같습니다.
- 어노테이션을 정의합니다.
- 클래스에 어노테이션을 배치합니다.
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시합니다.
Annotation 종류
@ComponentScan
@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation입니다.
@Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성합니다.
Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는,
예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문입니다.
또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있습니다.
@Component
@Component 은 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation입니다.
![](https://blog.kakaocdn.net/dn/n8DN5/btr5Toh9g7x/ffz3FYfhDIM6kZvmB363QK/img.png)
@Component(value="mystudent")
public class Student {
public Student() { System.out.println("hi"); }
}
Component에 대한 추가 정보가 없다면 Class의 이름을 camelCase로 변경한 것이 Bean id로 사용됩니다.
하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정합니다.
@Bean
@Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation입니다.
![](https://blog.kakaocdn.net/dn/vu4cc/btr6oYarW90/yVXGwE118K5f6Iwbd0I2y1/img.png)
@Autowired
속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해줍니다.
무조건적인 객체에 대한 의존성을 주입시킵니다.
이 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당합니다.
![](https://blog.kakaocdn.net/dn/bzLMLP/btr6oYO2iEl/mRNr0KrbrO8ia0wXL3PST0/img.png)
@Qualifier("id123")
@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation입니다.
같은 타입이 존재하는 경우 ex) 동물 = 원숭이, 닭, 개, 돼지
같은 타입의 Bean이 두 개 이상이 존재하는 경우에 Spring이 어떤 Bean을 주입해야 할지 알 수 없어서 Spring Container를 초기화하는 과정에서 예외를 발생시킵니다.
이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 합니다.
![](https://blog.kakaocdn.net/dn/bCxUsX/btr5YUnviPI/gIIph1uDKyIvpGeNy1jK3K/img.png)
xml 설정에서 bean의 한정자 값(qualifier value)을 설정합니다.
@Autowired 어노테이션이 적용된 주입 대상에 @Qualifier 어노테이션을 설정합니다.
@RequiredArgsConstructor
이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다.
주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다.
@Controller
Spring의 Controller를 의미한다. Spring MVC에서 Controller클래스에 쓰입니다.
@RestController
@Controller에 @ResponseBody가 결합된 어노테이션입니다.
컨트롤러 클래스에 @RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있습니다.
@Service
Service Class에서 쓰입니다.
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도입니다.
@Repository
DAO class에서 쓰입니다.
DataBase에 접근하는 method를 가지고 있는 Class에서 쓰입니다.
@RequestMapping
요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation입니다.
Controller나 Controller의 method에 적용합니다.
요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 합니다.
요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정됩니다.
![](https://blog.kakaocdn.net/dn/tkS1g/btr6ofjiqyH/otiKnzM5ATNkXV78KcLRdk/img.png)
@ModelAttribute
view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation입니다.
binding 기준은 <input name="id" /> 처럼 어떤 태그의 name값이 해당 Class의 멤버 변수명과 일치해야하고 setmethod명도 일치해야한다.
//view에 값을 전달할 때 request.setAttribute와 같은 느낌으로 사용합니다.
![](https://blog.kakaocdn.net/dn/us0Qr/btr53IG50P3/ZhrNdKdVtpKBeTcWUpsyZk/img.png)
![](https://blog.kakaocdn.net/dn/Enb42/btr6eVlDxZA/0cixX9NY5InSGO9i65HDk0/img.png)
@RequestParam
request의 parameter에서 가져오는 것입니다.
method의 파라미터에 사용됩니다.
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해줍니다.
HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어갑니다.
url 뒤에 붙는 parameter 값을 가져올 때 사용합니다.
//gender값을 data이름으로 파싱하여 받을 수 있습니다.
![](https://blog.kakaocdn.net/dn/ddvLRM/btr59ZBUcgQ/kRqyoQKFiiV9mC5cnrFKK1/img.png)
@PathVariable
매핑의 URL에 { } 로 들어가는 패스 변수(path variable)를 받습니다.
![](https://blog.kakaocdn.net/dn/nU3o7/btr6lpzSNfx/XGcFHzNo3bKIveTB8diJWK/img.png)
@Data
@Getter @Setter @EqualsAndHashCode @AllArgsConstructor @toString @equals 를 포함한 Lombok에서 제공하는 필드와 관련된 모든 코드를 생성합니다.
@ExceptionHandler(ExceptionClassName.class)
해당 클래스의 예외를 캐치하여 처리합니다.
@ControllerAdvice
Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는
각 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 붙여서 기술합니다.
@Controller Annotation
해당 어노테이션이 적용된 클래스는 "Controller"임을 나타나고, bean으로 등록되며 해당 클래스가 Controller로 사용됨을 Spring Framework에 알립니다
여기서 bean이란 ?
원래 자바 프로그래밍시 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후에 사용했다.
하지만 Spring에서는 직접 new를 이용하여 생성한 객체가 아니라,
Spring에 의하여 관리당하는 자바 객체를 사용한다.
이렇게 Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 한다
즉 객체를 빈으로 등록만 시켜놓으면 귀찮은 객체생성작업을 스프링 프레임워크에서 알아서 해준다
결과적으로는 view를 반환하는 controller클래스에는 @controller를 붙여주면된다.
(api컨트롤러 같은경우는 @restcontroller를 사용해야한다)
그럼 스프링프레임워크에게 얘가 컨트롤러에요! 라고 알려주는 것이다.
Controller 어노테이션을 붙여보자
@RequestMapping Annotation
다음은 RequestMapping 이다
RequestMapping은 Controller랑 항상 같이 쓴다고 보면됨
특정 url로부터 요청을 받으면 어떤 Controller에서 처리할 지 알아야 한다.
이 때, 특정 url을 요청을 수행할 Controller과 매핑하여 지정하는 어노테이션이 @RequestMapping이다.
이런식으로 "" 빈문자열을 쓰면
localhost:8080
뒤에 이렇게 아무것도 안적고 접속하면 해당 컨트롤러가 실행된다
page라고 만약 적으면
localhost:8080/page
이렇게 적어야 실행된다
아 그런데 RequestMapping은 그냥 controller를 구분하기 위한 것이고
실제 실행은 해당 controller 안에있는 메소드를 통해 실행된다
그러면 안에 있는 메소스드들은 공통적으로 page/를 포함한다.
그리고 일반적으로 page controller는 빈문자열로 두거나 requestmapping 어노테이션을 생략하면된다.
다음은 컨트롤러 안에 있는 메소드를 작성해보겠다
@GetMapping 은
http method와 매칭 되는 어노테이션으로
일치하는 메소드를 실행시켜준다.
보통 Get은 뷰를 리턴할때 많이 사용하고
Post는 데이터 연산하고 읽고 쓰고 주고받을때 사용
| View리턴방식
view를 리턴하는 방식은 여러가지가 있는데
대표적으로
ModelAndView 방식과
Model(ModelMap) 방식 이 있다.
#스프링 Model, ModelMap, ModelAndView 차이점
#Model, ModelMap Vs ModelAndView 차이점
- 데이터만 저장한다 vs 데이터와 이동하고자 하는 View Page를 같이 저장한다.
#Model, ModelMap 공통점
- model.addAttribute("변수명");
- modelMap.addAttribute("변수명");
- 둘 다 addAttribute를 사용한다.
- Model or ModelMap에 데이터만 저장 후 View에서 사용할 목적
- return "뷰이름"
Model, ModelMap 차이점
- Model - 인터페이스
- ModelMap - 클래스
#ModelAndView
- addObject를 통해 데이터를 저장한다.
- setViewName을 통해 이동하고자 하는 View를 저장한다.
- 메소드 안에서 ModelAndView mv = new ModelAndView();
- return type ModelAndView
- return new ModelAndView("뷰이름").addObject("객체이름",객체)
view를 대충 생성해보자
view에 해당하는 HTML은 templates 안에 생성하면된다
하나는 myhome
하나는 myroom 인데 myroom 은 house 라는 디렉터리를 생성한 후 그 안에 넣어보겠다
myroom.html
myhome.html
둘다 대충 글만 띄워지게끔 <h1> 태그로만 작성했다
다시 컨트롤러를 보면
myroom은 house 디렉터리안에 있기때문에
house/myroom으로 변경해야한다
그리고 이제 빌드를 시켜서 테스트를 해보자!ㅎㅎ
저 실행 버튼을 누르면된다
그럼 아래 콘솔창에 이렇게 스프링 표시도 뜨고
쭉쭉 잘 되다가
에러가 뜬다
application.properties 에 spl 등록을 안해줘서 그렇다
mysql을 디펜던시로 추가했기 때문에 mysql기준으로 적겠다
spring.datasource.url=jdbc:mysql://localhost:3306/[스키마명]
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=[DB접속ID]
spring.datasource.password=[DB접속PW]
설정 해주고 다시 실행해보자
그럼 이런식으로 실행시키는데 몇초가 걸렸다면서 서버가 정상적으로 실행된것을 확인할수있다!
크롬을 켜서 접속해보자
http://localhost:8080/home
http://localhost:8080/room
이렇게 사용자는 /home과 /room이라는 주소로 요청을 하고
요청을 받은 controller가
해당하는 뷰인 myhome.html과 house폴더 안에있는 myroom.html 파일을
로 불러와서 사용자에게 전달해준것이다.
'웹 개발 > 🍃 SpringBoot' 카테고리의 다른 글
SpringBoot | model(entity) with JPA Auditing (0) | 2023.04.19 |
---|---|
SpringBoot | ModelAndView에 데이터얹기 + Thymeleaf (0) | 2023.04.15 |
SpringBoot | REST API, HTTP Method (0) | 2023.03.21 |
SpringBoot | MVC패턴 (0) | 2023.03.21 |
SpringBoot | 세팅(2) (0) | 2023.03.05 |