본문 바로가기

Spring

240213 스프링 프로젝트

오늘부터 MVC 스프링으로 웹 개발 진행

 

src > main > webapp > WEB-INF > views  : .jsp 파일들이 들어가는 곳

 

pom.xml : jar 파일들을 추가하여 maven 에서 자동으로 다운로드 할 수 있게 함

 

 * @Controller : 컨트롤러
 * @Service : 서비스
 * @Repository : DAO
 * @Component : 그 외 객체로 만듬

 

기존에 있던 homeController 는 삭제하고 새로 IndexController 를 생성

@Controller
public class IndexController {
  
  // @RequestMapping(value="/", method = RequestMethod.POST)
  // @RequestMapping(value="/") // GET, POST 둘 다 입력
  // @RequestMapping("/") // value="/" 를 더 축약한 버전
  @RequestMapping(value="/", method = RequestMethod.GET)
  public String home() {
    
    return "index";
  }

 

웹에 "/" 접속 요청이 들어오면 index.jsp 를 열어줌

 

servelt-controller.xml 안의 

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <beans:property name="prefix" value="/WEB-INF/views/" />
  <beans:property name="suffix" value=".jsp" />
</beans:bean>

 

스프링에서 자동으로 /WEB-INF/views 에 return 한 String 값을 받아 .jsp 를 붙임

views 안에 있는 .jsp 파일을 열어줌

 

현재 index.jsp 파일은 없는 모습

 

이 상태로 스프링을 실행할 경우 404 오류를 반환

 

현재 배우는 과정은 스프링

이후 스프링 부트도 진행

 

스프링 = .jsp 를 사용하여 진행

스프링부트 = jsp, 타임리프

 

POJO : Plain Old Java Object, 스프링 책 p.50

DI : Dependency Injection, 의존성 주입

 

DI 는 필요한 객체를 찾아서 필요하다는 신호를 보낸 곳으로 해당 객체를 보내줌

서로의 의존성을 낮추고 직접 객체를 생성하지 않아도 객체를 사용할 수 있음

 

그런 관리를 Bean(빈) 이라고 부르고 빈과 빈을 처리하는 방식으로 개발을 진행

 

DI 테스트 해보기

package org.solbum.human;

// DI 테스트
// 기존 DTO 처럼 생성이 됨
public class Human {
  private int age;
  private String name;

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

 

Controller 에서 기존에 사용하던 방식

  @GetMapping("/")
  public String home() {
    // 기존에 진행하던 방식
    Human human = new Human();
    human.setAge(30);
    human.setName("sb");
    System.out.println(human.getAge());
    System.out.println(human.getName());
    
    return "index";
  }

 

<!-- root-context.xml 여기서 객체를 생성함 -->
<!-- class : 객체를 만들 클래스, 뒤에 패키지를 포함한 전체 이름 작성 -->
<!-- id : 해당 객체를 어떤 이름으로 할 지 설정 -->
<bean class="org.solbum.human.Human" id="human">
  <!-- 객체를 만들 때의 값 설정 -->
  <!-- name : 해당 객체의 값 이름 -->
  <!-- value : 해당 객체의 name 의 값 -->
  <property name="age" value="30"></property>
  <property name="name" value="sb"></property>
</bean>

 

다시 Controller 를 들어가서

@Inject 어노테이션을 사용

  // 의존성 주입
  // @AutoWired = 스프링 제공, 객체의 타입으로 검사
  //       @Qualifier("")
  // @Inject = 자바 제공, 객체의 타입이 일치하면 자동 주입
  //       @named("")
  // @Resource = 자바 제공, id 가 일치하는 것에 주입
  //       @Resource(name="")
  
  @Inject
  private Human human;
  
  @GetMapping("/")
  public String home() {
    // 기존에 진행하던 방식
//    Human human = new Human();
//    human.setAge(30);
//    human.setName("sb");
    System.out.println(human.getAge());
    System.out.println(human.getName());
    
    return "index";
  }

 

index 페이지를 로드 시 

설정한 값이 출력되는 모습

 

이제 Getter, Setter 를 직접 설정하는 것 보다

lombok (롬복) 을 이용하여 어노테이션으로 진행

@Getter
@Setter
public class Human {
  private int age;
  private String name;
}

 

 

 

Project Lombok

 

projectlombok.org

 

@Getter
@Setter
@Data

 

Getter, Setter 는 get, set 만 만들어주지만

Data 는 다른 문법들도 만들어줌

@Data 를 입력했을 때 생기는 메소드들

 

src/main/resources 밑에 spring 이라는 패키지를 만듦

패키지 안에

new -> spring bean configuration file 생성

 

db 접속 정보를 기록할 파일 생성 -> 안에 bean 생성

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
  <!-- DB 접속 정보 -->
  <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
    <property name="username" value="--"></property>
    <property name="password" value="--"></property>
    <property name="url" value="----"></property>
    <property name="driverClassName" value="org.maraidb.jdbc.Driver"></property>
  </bean>
	
  <!-- name = dataSource 인 Property 는 객체를 포함하고 있기 때문에 ref 로 값을 받음 -->
  <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mapperLocations" value="classpath:/mybatis/mappers/*-Mapper.xml"></property>
    <property name="configLocation" value="classpath:/mybatis/config/mybatis-Config.xml"></property>
  </bean>
  
  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
  </bean>
</beans>

 

resources > mybatis > config > mybatis-Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
  
  <configuration>
  	<typeAliases>
  		<!-- 우리가 만든 파일의 경로를 작성하여 별칭을 정해야 자바에서 확실하게 알 수 있음 -->
  		<typeAlias type="java.lang.Integer" alias="integer"/>
  		<typeAlias type="java.util.HashMap" alias="map"/>
  	</typeAliases>
  </configuration>

 

위에 적힌 것은 예시일 뿐임

 

mybatis > mappers > board-Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
<mapper namespace="board">
	<select id="boardList">
		select * from board
	</select>
</mapper>

 

  // 결합도는 낮을수록 좋음
  // 응집도는 높을수록 좋음
  
  // Controller -> Service -> Repository -> Mybatis -> DB
  // Repository : DAO 생성, DB : mariadb 연결
  // MVC : Model, View, Controller
  // Model : 데이터, 데이터의 값, DAO, DTO, Mybatis, DB
  // View : Model 값을 붙여 사용자에게 보여지는 화면, .jsp 파일
  // Controller : 흐름 제어, 사용자 요청이 들어오면 먼저 동작

 

/board 입력이 들어오면 board 로 넘어갈 수 있게 파일 생성하기

// 게시판 관련 기능 넣기
@Controller
public class BoardController {
  
  @PostMapping("/board")
  public String board() {
    
    return "board";
  }
}

 

board.jsp 파일 생성하여 실행해보기

@PostMapping 으로 어노테이션을 생성할 경우

@PostMapping 오류

해당하는 오류가 발생함

 

@GetMapping 으로 진행해야 해당 오류가 발생하지 않음

 

// 게시판 관련 기능 넣기
@Controller
public class BoardController {
  @GetMapping("/board")
  public String board() {
    return "board"; // jsp 파일 이름
  }
}

 

로 만들어야 정상 작동

 

Controller 는 생성하여 Service 를 생성

패키지를 service 를 따로 만들고, BoardService 생성

Service : Controller 의 요청에 맞추어 Repository 에서 받은 정보를 가공하여 Controller 로 넘겨주는 비지니스 로직

 

BoardList 를 출력하는 페이지 만들어보기

BoardController 에 BoardService 연결하기

  // 서비스와 연결하기
  @Autowired
  private BoardService boardService;

 

기존 BoardList 를 받아오는 것 만들기

// Service 에게 일 시키기
List<BoardDTO> list = boardService.boardList();

 

List 에 들어갈 값 타입이 BoardDTO 이기 때문에 BoardDTO 생성

@Getter
@Setter
public class BoardDTO {
  private int board_no, board_count, comment;
  private String board_title, mname, board_date;
}

 

lombok 을 사용하여 getter, setter 생성은 어노테이션으로 대체

outline 으로 get, set 잘 생성되었는지 체크

 

boardList() 메소드를 service 에 생성

  public List<BoardDTO> boardList() {
    System.out.println("서비스예요");
    return null;
  }

 

먼저 잘 연결되었는지 체크하기

 

boardList 메소드에서 값을 받아올 수 있게 DAO 생성

@Repository
public class BoardDAO {
}

 

@Repository 어노테이션을 통해 서버 실행 시 등록됨

 

BoardService 에 Controller 와 같이 @Autowired 를 통해 객체 생성하기

@Autowired
private BoardDAO boardDAO;

 

BoardService 에서 또 BoardDAO 에 일을 시킴

  public List<BoardDTO> boardList() {
    System.out.println("서비스예요");
    List<BoardDTO> list = boardDAO.boardList();
    return list;
    // return boardDAO.boardList(); 와 동일
  }

 

직접 글을 작성하여 리스트에 넣기

public List<BoardDTO> boardList() {
  System.out.println("DAO예요");
  List<BoardDTO> list = new ArrayList<BoardDTO>();
    
  BoardDTO dto = new BoardDTO();
  dto.setBoard_no(1);
  dto.setBoard_title("제목");
  dto.setMname("작성자");
  dto.setBoard_date("2024-02-13");
  dto.setBoard_count(10);
  dto.setComment(2);
    
  list.add(dto);
  return list;
}

 

BoardController 에 파라미터 입력값으로 Model 을 받음

 @GetMapping("/board")
  public String board(Model model) {
    // Service 에게 일 시키기
    List<BoardDTO> list = boardService.boardList();
    
    // 세팅하기
    model.addAttribute("list", list);
    
    return "board"; // jsp 파일 이름
  }

 

board.jsp 에는 테이블을 만들어서 출력

 

확인됐으면 DAO 에 아까 board-mapper.xml 에 설정한 mybatis 에 일 시키기

public List<BoardDTO> boardList() {
  System.out.println("DAO예요");
  return sqlSession.selectList("board.boardList"); // namespace.id
}

 

여기까지 진행하면 오류 발생

mybatis-Config.xml 에 typealias 설정을 진행해야 함

<configuration>
  <typeAliases>
    <!-- 우리가 만든 파일의 경로를 작성하여 별칭을 정해야 자바에서 확실하게 알 수 있음 -->
    <typeAlias type="org.solbum.dto.BoardDTO" alias="boardDTO"/>
  </typeAliases>
</configuration>

 

board-Mapper.xml 에 결과값 타입도 설정해줘야 함

<mapper namespace="board">
  <select id="boardList" resultType="boardDTO">
    select board_no, board_title, mname, board_date, board_count, comment 
    from boardview limit 0, 10
  </select>
</mapper>

 

하면 정상적으로 출력되는 것을 볼 수 있음

 

mybatis 에서 resultType 과 parameterType 의 차이점을 검색해봄

mybatis 의 공식 설명

 

'Spring' 카테고리의 다른 글

240220 스프링 프로젝트  (0) 2024.02.20
240219 스프링 프로젝트  (0) 2024.02.19
240216 스프링 프로젝트  (2) 2024.02.16
240215 스프링 프로젝트  (0) 2024.02.15
240214 스프링 프로젝트  (1) 2024.02.14