Spring Boot

spring boot 기초, Thymeleaf 기초 (each, status)

머리방울 2022. 8. 29. 12:07

IOC Inversion Of Control 제어의 역전

사용해야 하는 객체를 만들어서 코드 개발( 원래 개발자가 함)

그러나 스프링에서는 객체를 스프링 컨테이너가 만들어 준다

why? 클래스 간 결합도를 낮추기 위해서 

 

DI(Depandency Injection) 의존성 주입

spring에서는 자동으로 객체 만들어주기 위해서는 

해당 패키지 안에 있어야 가능하다.

만약 패키지명 잘못 작성하면 프로젝트 지우고 다시 만드는것이 낫다.

 

기존 jsp controller에서는 

MemberController(*.me) 로 실행한다고 한다면

spring에서는

MemberController("/member") 실행시킨다.

http://localhost:8081/member/join 으로 실행된다. 

 

 

<스프링은 객체를 직접 생성하지 않고, 스프링이 자체적으로 객체를 생성하도록 작성한다>

 

1. 스프링이 프로젝트 시작과 동시에 필요한 객체를 먼저 생성할 수 있도록 설정

1) 객체를 생성하고자 하는 클래스는 반드시 기본 패키지 내에 선언되어 있어야 한다

2) 객체를 만들고자 하는 클래스의 객체를 생성해 달라는 코드 작성

 -> 객체 만들고자하는 클래스 상단에 annotation 사용

  i) @component -> 스프링 초창기 버전, 요즘 잘 안씀, 사용해도 오류나진 않음

   아래와 같이 세가지로 세분화하여 사용한다.

    ii) @Controller

   iii) @Service

   iv) @ Repository 

 

★위 4개의 Annotation을 사용하면 객체를 생성하는데,

생성되는 객체명은 클래스명의 앞글자만 소문자로 바꾼 이름으로 객체명이 정의된다.

ex)

@Controller

public class TestController{ }

-> TestController testController = new TestController(); 이런식으로 만들어진다.

 

객체명을 다르게 만들고 싶을 때 소괄호 안에 변수명 작성하여 지정 가능하다.

@Controller("controller")

public class TestController{ }

-> TestController controller = new TestController();

 

2. 프로젝트 생성과 동시에 만들어진 객체를 적절하게 의존성 주입시키는 코드 작성

 1) 의존성 주입이 필요한 객체명 위에 Annotation을 적용하여 코드 작성

   (이미 만들어진 객체를 필요한 객체에 주입시키는 것)

    i) @Autowired - 자료형을 기준으로 의존성 주입 시킬 객체를 판단

    ii) @Resource - 만들어진 객체명을 기준으로 의존성 주입을 시킨다.

 

상황) 프로젝트 시작(Run)과 동시에 만들어진 객체 정보

a. BoardController controller = new BoardController();

b. BoardService service = new BoardService();

c. BoardDTO board = new BoardDTO();

d. BoardService service1 = new BoardService();

 

public class Test1{

@Autowired  - 자료형을 기준으로 의존성 주입을 시킬 객체 판단

(해석: private BoardDTO dto = board;)

 private BoardDTO dto;   <- c 사용  

 

*오류 발생 코드

@Autowired   -> 자료형이 같은것이 두가지가 있기에 무엇을 넣어야 할지 모른다

private BoardService service;

 

@Resource (name = "service")  객체명이 service인걸로 의존성 주입 시키겠다.

private BoardService service;

 

*오류 발생 코드

@Resource(name ="controller")  - 객체명 불일치로 의존성 주입 불가 

private BoardService service;

 

*오류 발생 코드 

@Autowired -  MemberDTO 자료형 없음

private MemberDTO member;

}

 

 

Thymeleaf 기초

<table border="1">
<tr>
<td>제목</td>
<td>작성자</td>
<td>index(index 0부터)</td> <!-- (현재 반복중인 index번호 0부터 시작) -->
<td>count(index 1부터)</td>  <!--현재 반복중인 index번호 1부터 시작 -->
<td>size(총개수)</td> <!-- 총 개수 -->
<td>current(현재 반복 객체 정보)</td> <!-- 현재 반복되고 있는 객체 정보 -->
<td>even(짝수)</td> <!-- 짝수행에 true  -->
<td>odd(홀수)</td>  <!--홀수행에 true -->
<td>first(첫 행)</td> <!-- 첫 행 여부 -->
<td>last(마지막 행)</td> <!--마지막 행 여부  -->
</tr>
<tr th:each="board, status : ${list}">


<td th:text="${board.title}"></td>
<td th:text="${board.writer}"></td>



<td th:text="${status.index}"></td>
<td th:text="${status.count}"></td>
<td th:text="${status.size}"></td>
<td th:text="${status.current}"></td>
<td th:text="${status.even}"></td>
<td th:text="${status.odd}"></td>
<td th:text="${status.first}"></td>
<td th:text="${status.last}"></td>
</tr>

</table>

 

status 작성하지 않고 사용하기 Statu

 

<table border="1">
<tr>
<td>제목</td>
<td>작성자</td>
<td>index(index 0부터)</td> <!-- (현재 반복중인 index번호 0부터 시작) -->
<td>count(index 1부터)</td>  <!--현재 반복중인 index번호 1부터 시작 -->
<td>size(총개수)</td> <!-- 총 개수 -->
<td>current(현재 반복 객체 정보)</td> <!-- 현재 반복되고 있는 객체 정보 -->
<td>even(짝수)</td> <!-- 짝수행에 true  -->
<td>odd(홀수)</td>  <!--홀수행에 true -->
<td>first(첫 행)</td> <!-- 첫 행 여부 -->
<td>last(마지막 행)</td> <!--마지막 행 여부  -->
</tr>
<tr th:each="board : ${list}">
<td th:text="${board.title}"></td>
<td th:text="${board.writer}"></td>
<td th:text="${boardStat.index}"></td>
<td th:text="${boardStat.count}"></td>
<td th:text="${boardStat.size}"></td>
<td th:text="${boardStat.current}"></td>
<td th:text="${boardStat.even}"></td>
<td th:text="${boardStat.odd}"></td>
<td th:text="${boardStat.first}"></td>
<td th:text="${boardStat.last}"></td>
</tr>

</table>

 

<table border="1">
<!-- #numbers 타임리프 내 함수 사용할 때 # 붙인다 -->
<tr th:each="num : ${#numbers.sequence(1, 5)}">
<td th:text="${num}"></td>
</tr>
</table>