Spring(수업 정리#1) 어노테이션, controller, status종류, Dao, Service

최동민·2022년 5월 24일
0

Spring 수업정리

목록 보기
5/47

터미널에서 mysql -u root -p 입력
설정한 password 입력
CREATE USER 'spring'@'localhost' IDENTIFIED BY 'test1234'; 입력
GRANT ALL ON . TO 'spring'@'localhost'; 입력
FLUSH PRIVILEGES; 입력

New Project 클릭 후 Spring Initializr 에서 아래와 같이 입력 packagion은 War임!

좀 더 안정성 있는 2.6.8로 바꿔준 후 Create

pom.xml에 아래와 같은 내용이 추가된다.
(thymeleaf 내용은 글 아래 내용에서 가져온 것이니 일단 쭉 살펴보자.)

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.6.8</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>dev.dmchoi</groupId>
<artifactId>gujo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>gujo</name>
<description>gujo</description>
<properties>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>2.6.7</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

스프링이 인식하도록 붙여주는 어노테이션들

@Controller {class} : 해당 클래스가 컨트롤러임을 지정

@RestController {class} : 해당 클래스가 컨트롤러임을 알리나 이가 포함하는 모든 RequestMapping 어노테이션을 가지는 메서드에 @ResponseBody 가 있는 것과 같은 효과를 가짐.

@RequestMapping {class|method} : 해당 클래스나 메서드에 맵핑 지정

@ResponseBody {method} : 해당 메서드의 반환 값이 응답값 자체로 사용됨을 지정

@RequestParam {variable} : 요청 매개변수를 받도록 지정

@Service {class} : 해당 클래스가 서비스임을 지정

@Autowired {constructor} : 생성자에 명시된 매개변수를 스프링이 인식 가능한 범위 내에서 객체화해야 한다고 지정

@Repository Dao는 이거 사용


dev.dmchoi.gujo에 controllers 폴더를 생성.

TestController을 생성해보자.


다음엔 RootController을 생성해보자.

getIndex에서 get은 메서드. Index는 첫 페이지가 됨

자바 관련된 것들은 java 파일에.
resources 파일에서 정적인 것들은 static 파일에 들어간다. css 등.
static 폴더에는 기본적으로 맵핑이 들어가 있다.
하지만 템플릿 폴더는 맵핑이 들어가있지 않다. http://localhost:8080/root/index.html 이 안된다는 뜻
들어가보면 status == 404가 뜰 것. type은 not found.


알아두어야 할 오류 종류

400 Bad Request
매개변수가 요구로 하는 값을 정상적으로 주지 않을 때

403 Forbidden
잘 볼 일은 없음

404 Not Found

405 Method Not Alloewed
니가 요청한 메서드로는 해당 요청을 처리해 줄 수 없다.

500 Internal Server Error


pom.xml에 타임리프를 추가하였다.
타임리프를 쓸 때 html 파일은 templates에 속한다.

루트컨트롤러 클래스에 겟인덱스 메소드를 가졌을 때 templates 폴더에 root/index.html를 만들어주어야 함

root/index.html파일에 Here is index html!라고 적은 후
RootController에서 http://localhost:8080 에 들어가보면


사이트에서 내용이 나오는 것을 확인할 수 있다.
즉 창에 뜰 내용은 resources -> templates -> root/index.html에서 작성하는 것.

@ResponseBody를 주석처리 하지 않으면 사이트에 return 값에 담아둔 root/index 라는 내용이 나오니 주의하자.
이유는 @ResponseBody는 다른 템플릿을 사용하지 않고 해당 메서드가 응답을 바로 뱉어내기 때문.


이번에는 MessageController 를 만들어보자.

템플릿에 message/index.html을 만들고 아래 html내용을 추가하였다.

출력해보면


그냥 주소 찍고 들어가면 get요청이다. 안에서 텍스트를 적으면 post요청이다.
get요청은 말 그대로 화면만 보여주면 된다. post일 때에는 실제로 무언가 이루어져야 한다. db에 메세지가 들어가던지 등..


MessageController 에 내용을 추가한다.

HttpServletRequest
: Http프로토콜의 request 정보를 서블릿에게 전달하기 위한 목적으로 사용.
Header정보, Parameter, Cookie, URI, URL 등의 정보를 읽어들이는 메소드를 가진 클래스

HttpServletResponse
: Servlet은 HttpServletResponse객체에 Content Type, 응답코드, 응답 메시지등을 담아서 전송함

웹브라우저 사용자인 클라이언트로부터 서버로 요청이 들어오면 서버에서는 HttpServletRequest 를 생성하며, 요청정보에 있는 패스로 매핑된 서블릿에게 전달한다.
이렇게 전달받은 내용들을 파라미터로 Get과 Post 형식으로 클라이언트에게 전달하게 된다.

ip주소를 구하는 방법
String ip = request.getRemoteAddr(); 만으로 안될 때
https://jul-liet.tistory.com/202 참조


daos에 MessageDao 생성

DAO(Data Access Object)는 실제로 DB에 접근하는 객체이다.
Service와 DB를 연결하는 고리의 역할을 한다.
DAO는 개발자가 직접 코딩해야되는 부분이다.
SQL를 사용하여 DB에 접근한 후 적절한 CRUD API를 제공한다.

DataSource 생성
DB와 관계된 connection 정보를 담고 있으며, bean으로 등록하여 인자로 넘겨준다. 이 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.

DataSource 설정 및 Bean 등록, 주입 방법

DB와의 연결을 위해 DB서버 정보(Property)를 설정한다. (하드코딩을 피하기위해 파일로 설정 → 이곳에서만 수정하면 다른 모든부분에 변경내용이 적용되므로 이렇게 하는것이 좋다.)
(설정 정보: driver, url, , username, password)
설정한 property file을 통해 DataSource를 빈으로 등록한다.
Spring JDBC를 이용하려면 DB 커넥션을 가져오는 DataSource를 빈으로 먼저 등록해줘야함!!
생성된 DataSource빈을 Spring JDBC에 주입한다.

(Bean에 대해 참고할 내용)

@Contoller 어노테이션을 붙이면 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성된다. 마찬가지로 @Repository, @service 어노테이션은 해당 클래스를 루트 컨테이너에 빈(Bean) 객체로 생성해주는 어노테이션이다.
둘 다 Bean 객체를 생성해주고 딱히 다른 기능을 넣어주는게 아니라서 뭘 써도 상관 없긴한데 명시적으로 구분해주기 위해 각자 분리해서 사용합니다. 부모 어노테이션인 @Component를 붙여줘도 똑같이 루트 컨테이너에 생성되지만 가시성이 떨어지기 때문에 잘 사용하지 않습니다.

참고로 객체 내에서 데이터 변경 작업이 있는 VO(DTO) 객체와 같은 경우는 동기화 문제로 인해 Bean 객체로 사용하지 않습니다. Bean 객체는 항상 데이터 변경이 없는 객체에 한해 사용하는 점에 유의해야 합니다.

컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)
https://codevang.tistory.com/258

우리는 자동 의존성 주입 어노테이션으로 @Autowired를 사용하였다


1번 작업
application.properties에 DB Server에 관한 정보(Property) 설정


MessageService 추가

profile
코드를 두드리면 문이 열린다

0개의 댓글