Spring

[Spring] spring boot 스프링부트

sian han 2022. 5. 31. 22:57

※ 스프링부트

 

· 스프링 프레임 워크를 사용하면 많은 XML 설정 파일등을 작성하는 등 설정하는 방법이 어려운 편이다.

    =>  spring boot 는 간편하게 설정할 수 있는 스프링 프레임웍의 서브프로젝트로,

           쉽고 빠르게 프로젝트를 설정할 수 있도록 도와준다

· Spring Boot는 최소한의 초기 스프링 구성으로 가능한 한 빨리 시작하고 실행할 수 있도록 설계되었다

· 내장 Tomcat 

  ㄴ 웹 어플리케이션서버를 통합한 경량의 웹개발 프레임워크

 

 

 

 

▶ 스프링부트에서 기본생성되는 폴더 & 파일 

 

  ▷ templates 폴더 - src/main/resources/ [templates] 폴더

         - 스프링 부트는 타임리프(Thymeleaf) 템플릿 엔진의 사용을 권장

         - Thymeleaf (.html), Velocity(.vm)등과 관련된 파일만 동작하고 jsp 파일은 추가하여도 작동하지 않는다

         - Thymeleaf : JSP와 마찬가지로 HTML 내에서 데이터를 처리하는 데 사용됨 (뷰)  /  서버에서 받아오는게 있음

 

  static 폴더 - src/main/resources/[static]

         - 서버에서 받아오는게 없는 정적인페이지

         - css, fonts, images, plugin, scripts 등의 정적 리소스 파일이 위치함

 

  application 파일 , properties 파일 

         - 톰캣(Tomcat)과 같은 WAS(포트 번호, 콘텍스트 패스 등 )의 설정이나,

            데이터베이스 관련 정보 등 각각으로 분리되어 있는 XML 또는

            자바 기반의 설정을 해당 파일에 Key-Value 형식으로 지정해서 처리할 수 있다

 

 

 


 

 

 

▶ API

  ▷ @ResponseBody 문자 반환

         - HTTP의 BODY에 문자 내용을 직접 반환

결과 : hello hong

 

 

  ▷ @ResponseBody 객체 반환

         - @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환 됨

결과 : {"name":"hong"}

 

 

 

▶ jsp를 사용하는 방법

 

[1] pom.xml

      - jasper, jstl을 의존성에 추가해야 JSP파일의 구동이 가능

 

[2] JSP 경로 설정(디렉토리 생성)

      - WEB-INF/views/  ( /src/main/webapp/WEB-INF/views/ )

 

[3] application.properties

  - Spring 애플리케이션 시작시 application.properties 파일에 정의된 내용을 로드한다

 ▷ server.port : 별다른 설정을 하지 않으면 default 포트는 8080

 ▷ prefix/suffix : jsp 페이지를 처리하기 위한 prefix와 suffix를 application.properties에 추가

 

[4] Controller 작성

[5]  jsp파일 서버 재시작 없이 바로 적용하기

      - 스프링 부트는 스프링 프로젝트와 다르게,

        동적 파일들의 파일 변경을 자동으로 반영하지 않기때문에 설정추가해야함

[6]  Application 실행

 


▶ @Mapper

 

기존의 스프링은 DAO 클래스에 @Repository 를 선언해서 해당 클래스가

데이터베이스와 통신하는 클래스임을 나타냈다.

Mybatis 는 인터페이스에 @Mapper 만 지정해주면 XML Mapper 에서 메서드의 이름과 일치하는 SQL문을 찾아 실행한다

 

Mapper 영역은 데이터베이스와의 통신, 즉 SQL 쿼리를 호출하는 것이 전부이며, 다른 로직은 전혀 필요하지 않다

 

 

 

▷ package com.it.herb.board.model;

@Mapper
public interface BoardDAO {
public int insertBoard(BoardVO vo);
public List<BoardVO> selectAll(SearchVO searchVo);
public int selectTotalRecord(SearchVO searchVo);
public int updateReadCount(int no);
public BoardVO selectByNo(int no);
public int updateBoard(BoardVO vo);
public int deleteBoard(BoardVO vo);
public List<BoardVO> selectMainNotice();
}

 

 

board.xml

<mapper namespace="com.it.herb.board.model.BoardDAO">
<insert id="insertBoard" parameterType="boardVO">
    <selectKey keyProperty="no" resultType="int" order="BEFORE">
        select board_seq.nextval from dual 
    </selectKey>
    insert into board(no,name, pwd, title, email, content)
    values(#{no} ,#{name}, #{pwd}, #{title}, #{email}, 
    #{content})
</insert>

 

 


▶ DBConfiguration

 

▷ @Configuration

      - 스프링은 @Configuration이 지정된 클래스를 자바 기반의 설정 파일로 인식.

 

@PropertySource

      - 스프링은 @Configuration이 지정된 클래스를 자바 기반의 설정 파일로 인식.

 

@Autowired

      - 빈(Bean)으로 등록된 인스턴스(이하 객체)를 클래스에 주입하는데 사용

      -  @Autowired 이외에도 @Resource, @Inject 등이 존재

 

 ApplicationContext

 

 @ConfigurationProperties

      - 인자에 prefix 속성을 지정할 수 있고, (prefix는 접두사) prefix에 spring.datasource.hikari를 지정

      - @PropertySource에 지정된 파일(application.properties)에서

         prefix에 해당하는 spring.datasource.hikari로 시작하는 설정을 모두 읽어 들여 해당 메서드에 매핑(바인딩)함

 

Hikari : Connection pool의 일종

  - Hikari는 Database와의 Connection Pool을 관리해준다

 

 

 DataSource

      - 데이터 소스는 커넥션 풀을 지원하기 위한 인터페이스

 

▷ sqlSessionFactory

      - SqlSessionFactory는 데이터베이스의 커넥션과 SQL 실행에 대한 모든 것 을 갖는 중요한 역할을 함

 

sqlSession

      - SqlSessionTemplate은 SqlSessionFactory를 통해 생성되고,

        데이터베이스의 커밋, 롤백 등 SQL의 실행에 필요한 모든 메서드를 갖는 객체

 

 


▶ 트랜잭션 처리

  ▷ tx:annotation-driven : @Transactional를 선언하여 트랜잭션 처리를 할 수 있다

 

 

@RestController

@Controller 대신에 @RestController 애노테이션을 사용하면,

해당 컨트롤러에 모두 @ResponseBody 가 적용되는 효과가 있다

 

@ResponseBody : 뷰 템플릿을 사용하는 것이 아니라, HTTP 메시지 바디에 직접 데이터를 입력한다.

이름 그대로 Rest API(HTTP API)를 만들 때 사용하는 컨트롤러이다

 

@GetMapping, @PostMapping

 

@Controller
public class MemberController {
    private final MemberService memberService;
    @Autowired
    public MemberController(MemberService memberService) {
   	 this.memberService = memberService;
    }
    @GetMapping(value = "/members/new")
    public String createForm() {
  	  return "members/createMemberForm";
    }
    @PostMapping(value = "/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());
        memberService.join(member);
       return "redirect:/";
    }
    @GetMapping(value = "/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }
}

 

 


▶ Lombok(롬복)

       - 자동으로 기본적인 상용구를 생성 해줌으로써 코드량을 줄이는데 도움을 주는 Java 어노테이션 라이브러리

 

▷ 롬복설치하기

https://projectlombok.org/download

 

Download

 

projectlombok.org

 

lombok.jar가 있는 디렉토리 - C:\Users\EZEN\.m2\repository\org\projectlombok\lombok\1.18.24

 

 

 

@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor

    public class BasicItemController {
        private final ItemRepository itemRepository;
        
        @GetMapping
            public String items(Model model) {
            List<Item> items = itemRepository.findAll();
            model.addAttribute("items", items);
            return "basic/items";
    }
}

@RequiredArgsConstructor - final 이 붙은 멤버변수만 사용해서 생성자를 자동으로 만들어준다

 

 

public BasicItemController(ItemRepository itemRepository) {
    this.itemRepository = itemRepository;
}

  - 생성자가 1개만 있으면 스프링이 해당 생성자에 @Autowired 로 의존관계를 주입해준다.

     따라서 final 키워드를 빼면 안된다, 그러면 ItemRepository 의존관계 주입이 안된다