Q. GamjaApplication을 실행하였을때 동일한 폴더의 HelloController가 실행되는 원리는 무엇일까?
package com.gamja.gamja;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GamjaApplication {
public static void main(String[] args) {
SpringApplication.run(GamjaApplication.class, args);
}
}
GamjaApplication.java 를 이렇게 작성하고,
package.com.gamja.gamja;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index()
{
return "Hello, world!";
}
}
HelloController를 다음과 같이 작성하였을 때, GamjaApplication class를 실행하면 HelloContoller의 반환값이 출력된다.
왜?왜 왜왜?
내 생각엔 URL 요청이 왔을 때 RequesMapping으로 해당 요청을 처리할 수 있는 Controller어노테이션 ( 여기서는 RestController어노테이션이 되겠다.) 을 찾아 요청을 Controller에게 보내고 결과값을 return 하는 원리인 것 같다.
Q. Controller 어노테이션의 역할은 뭘까?
- 특정 클래스가 컨트롤러 역할을 수행함을 나타낸다.
- 컨트롤러 역할이란? : 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출.
Q. RestController란?
@RestController : MVC @Controller에 @ResponseBody가 추가된 것이다. 컨트롤러 클래스의 하위 메소드에 @ResponseBody를 붙이지 않아도 문자열과 JSON을 반환할 수 있다. (메서드마다 ResponseBody를 추가하지 않아도 된다.)
Q. Mapping의 종류와 기능, 사용법
@RequestMapping 어노테이션 : URL을 매핑해준다. 즉 클래스가 동작하는 URL을 지정해준다. 클래스 뿐만 아니라 메소드 레벨에서도 사용할 수 있으나, 메소드 레벨에서 사용하는 annotation은 다음과 같다.
- @GetMapping 어노테이션 : Get방식으로 RequestMapping을 한다. 메소드에만 적용됨. 주소에 파라미터가 노출
- @PostMapping 어노테이션 : Post방식으로 RequestMapping을 한다. 주소창에 파라미터가 노출되지 않는다.
이 두 어노테이션은 RequestMapping의 축약형이라 할 수 있다. 그이유는,
@RequestMapping(value = "/getList", method = {RequestMethod.POST})
@PostMapping("/getList")
다음과 같이 코드 길이를 줄일 수 있기 때문이다.
Q. Model 객체가 있던데?
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data","hello!");
return "hello";
}
다음 코드를 보면 Model 타입의 객체가 있는 것을 볼 수 있다.
Controller의 메서드 한정, Model 타입의 객체를 파라미터로 받을 수 있다. request.setAttribute()와 비슷한 역할
- request.setAttribute(String name, Object value): 이름이 name인 속성의 값을 value로 지정한다.
@ModelAttribute 어노테이션을 사용해서 기본 자료형 (int, double)을 view에 전달해 줄 수 있다.
@GetMapping("/hello")
public String hello(SampleDTO dto, @ModelAttribute("mypage") int page) {
return "hello"
}
이런 식으로 ? 이야기가 삼천포로 빠지네 이게 중요한게 아니라
아무튼 Model 객체를 파라미터로 받음으로써 model.addAttribute 메소드를 활용해 data에 hello의 값을 지정할 수 있는 것이다.
Q. JPA를 사용할 때 알아야할 개념들
Entity 클래스 : 실제 DB의 테이블과 1 : 1 매핑되는 클래스, DB의 테이블 내에 존재하는 컬럼만을 속성으로 가져야 한다. 그러니까 테이블의 각각의 컬럼을 포함하는 클래스라는 것이다. Domain Logic만 가질 수 있고, 변경되게 되면 다른 클래스에 영향을 끼친다.
DTO 클래스 : Domain Model(관련된 도메인의 시각적 표현, Persistent만을 위해서 사용된다.)에 다양한 Presentation Logic을 추가한 정도로 사용.
Q. 특정 URL로 이동하였을 때 Login 화면을 구현하고 싶으면 어떻게 해야할까?
일단 Login 페이지를 구성하는 html 코드를 만들어야 한다. Hello, world!를 표시하고 싶으면 Hello Controller에서 RequestMapping("/")밑에 return "Hello,world!"를 만들었었다. 혹은 resources>index.html에 welcome page를 만들어 Hello, world!를 출력하였었다. 혹은 GetMapping으로 주소를 지정해주고 return 값을 templates 패키지 안에 생성한 html문의 이름으로 지정해줘서 html문이 실행되게 하였다. 뭐 이리 많아? 아무튼 이렇게 해서 html파일에 login화면을 구현해주면 된다.
Q. Bean이 정확히 어떤 거지?
여기에 설명이 잘 되어있다.
Bean이란, Spring이 제공하는 Container을 통해서 관리되는 인스턴스이다.
- Container : 주입을 이용해 객체를 관리하는 그릇 혹은 용기와 같은 개념이다. 왜 컨테이너를 사용할까 ? new 생성자나 getter/setter을 통해 사용되는 객체들은 상호 간 의존도가 높고 무수히 많이 존재하는 경우가 있다. 이렇게 객체 간의 의존성을 낮추기 위해 컨테이너가 존재한다.
- 객체, 클래스, 인스턴스가 뭔가요?
public class Animal{
Animal cat = new Animal();
}
다음 코드에서 Animal은 클래스, cat은 객체이다. 또한 cat이라는 객체는 Animal라는 클래스의 인스턴스라고 할 수 있다. 즉 인스턴스는 객체와 클래스의 관계를 의미하는 말이다.
"cat은 인스턴스" (X) "cat은 객체" (O) 이며, "cat은 Animal의 객체" (X) "cat은 Animal의 인스턴스" (O) 라는 말이다.
public class Animal {
String name = "meow";
public static void main(String[] args) {
Animal cat = new Animal();
System.out.println(cat.name);
}
}
여기서 Animal 클래스 안에서 선언해준 name 변수는 "객체 변수"라고 한다. Animal 자료형으로 선언한 cat은 하나의 객체이며 Animal 클래스와 인스턴스 관계가 있다. "객체.객체변수"처럼 점(.)으로 객체에 접근해 출력시켜주면 결괏값은 "meow", 객체변수의 값이 출력된다.
그렇다면 메소드는 무엇일까?
자바에서는 함수가 존재하지 않고 클래스 내에 메소드가 존재한다. (함수 = 클래스 내의 메소드)
용어 정리 : 입력 값 : 메소드의 인수, 입력 인수 / 리턴 값 : 출력 값, 결과 값, 반환 값
아무튼 Bean이라는 것은 스프링이 컨테이너 내에서 관리하는 객체 하나하나를 의미한다.
Q. 일반 클래스와 추상클래스의 차이가 뭔가요?
추상 클래스란, 여러 (일반 혹은 실체)클래스들 간에 비슷한 필드와 메서드를 공통적으로 추출해 만들어진 클래스이다.
* 필드 : 클래스를 구성하는 요소 중 하나로, 클래스 내부 멤버이다. (클래스 내부에서 독립적으로 선언되는 변수)
예제를 보면서 필드와 객체에 대해 배워보자.
class Car{
int num;
double gas;
}
public class Sample1{
public static void main(String[] args)
{
Car car1 = new Car(); //객체 1
Car car2 = new Car(); //객체 2
car1.num = 1234;
car2.num = 1111;
car1.gas = 20.5;
car2.gas = 40.2;
System.out.println("차량 번호는"+car1.num+" "+car2.num+"입니다.");
System.out.println("가스량은"+car1.gas+" "+car2.gas+"입니다.");
}
}
필드와 메소드 모두 클래스의 멤버(member)라고 한다.
돌아와서, 추상 클래스는 메서드와 필드 등이 구체적이지 않아서 객체를 생성할 수 없다. 느낌이 오면 알겠지만, 추상 클래스와 실체 클래스는 상속 관계를 가진다.
Q. 인터페이스란 뭔가요?
인터페이스는 쉽게 말하면 껍데기이다. 설계도라고도 할 수 있고?
모든 메소드가 추상 메소드이므로 일반 변수를 가질 수 없다. (굳이 abstract를 적지 않아도 추상 메서드임을 알 수 있다.)
+ JpaRepository 인터페이스 : 인터페이스에 미리 검색 메소드를 정의해둠으로써 메소드를 호출하는 것만으로도 스마트한 데이터 검색을 할 수 있게 되는 것이다.
@Repository
public interface 인터페이스명 extends JpaRepository <엔티티, ID 유형>{}
다음과 같이 사용
'Framework > Spring' 카테고리의 다른 글
[스프링 입문] 스프링 빈과 의존 관계 (0) | 2021.05.25 |
---|---|
스프링 부트와 JPA 활용1 - 프로젝트 환경 설정 (0) | 2021.05.19 |
스프링 복습 및 기초 다지기 (0) | 2021.02.05 |
인프런 스프링 입문 강의 #JPA (0) | 2021.02.02 |
인프런 스프링 입문 강의 #백엔드 개발 (0) | 2021.01.30 |