순서

 DB - dao - Service - Controller - view 

 

 

(중간계층 service 추가)

 

 

 

1. 레시피 게시판 DB 만들기

 

CURRENT_TIMESTAMP 는 현재시간과 날짜가 입력되는 것. = now()

= registerdate timestamp default now()

 

 

테스트용 만들기

INSERT INTO recipe(title,content,ingredient,writer) values
('라이스페퍼 감자떡','1.감자는 껍질 벗기고 물에 삶아준다.','감자,라이스페퍼,두부마요네즈,콩가루,아몬드가루,소금,후추','요리연구가');

 

 

 

 

 

 

 

- RecipeVO 만들기 

 

: 테이블을 매핑X, 데이터들을 가져오는것만!

@Data
public class RecipeVO {
	
	/* 게시판 번호 */
	private int bno;
	
	/* 게시판 제목 */
	private String title;
	
	/* 재료  */
	private String ingredient;
	
	/* 게시판 내용 */
	private String content;
	
	/* 게시판 작가 */
	private String writer;
	
	/* 등록 날짜 */
	private LocalDateTime registerdate; 
	
	/* 수정 날짜 */
	private LocalDateTime updateDate;
	
}
@Getter @Setter @ToString 세개 모두 쓰는게 @Data
LocalDateTime :  DB의 timestamp에서 날짜시간을 가져오는 자바 날짜시간데이터

 

 

 

 

dao = mapper

 

2. ReciepMapper 인터페이스 생성하기 

→ 인터페이스 구현을 xml에서 한다!

 

 

@Mapper 어노테이션 쓰기

 

1. 새로운 레시피 게시판을 등록 

@Mapper
public interface RecipeMapper {

	/* 게시판 등록 */
	public void enroll(RecipeVO board);
	
}
public void enroll(RecipeVO board); 
RecipeVO는 입력

 

MyBatis 란??

 Mybatis는 .JDBC의 작업을 간편하게 이용할 수 있도록 개발된 persistence framework(영속성 프레임워크)이다.

JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.

 

persistence 

데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터

 

persistence framework

데이터베이스와의 연동되는 시스템을 빠르게 개발하고 안정적인 구동을 보장해주는 프레임워크 

장점 : 재사용가능, 유지보수

 

 

 

SPRING에서 JDBC를 사용할 수 있지만 , MYBATIS 를 사용 하는것이 보통이다. 

 

기존 JDBC

JDBC 란 무엇일까?

- Java Database Connectivity

- 자바 프로그램이 데이터베이스와 연결하여 데이터를 주고받게 하는 프로그래밍 인터페이스

  즉 JDBC는 DB에 접근할수있도록 JAVA에서 제공해주는 API 이다.

 

 

JDBC의 역할

응용프로그램과 DBMS(데이터저장 및 관리) 사이에서 중간 번역 역할

 

 

단점

프로그램 소스안에서 직접 connection을 맺고 SQL문을 처리하고 rs.next() 등을 이용하여 하나씩 받아와야 해서 코드가 길어지고 SQL의 변경이 필요한 경우에도 java 프로그램을 수정하기 때문에 유연성이 좋지 못하다

 

 

 

MyBatis

SQL문을 자바 코드에서 분리하여 xml 파일로 따로 관리하여 변환이 자유롭고 가독성이 좋다.

JDBC에서 사용해야 하는 CONNETION, STATEMENT등을 MYBATIS가 직접 관리해서 코드를 줄여준다.

 

 

 

 

[ application.prperties ]

MyBatis 기본 설정하기

# MyBatis
# mapper.xml 위치 지정 -> resource폴더에 mapper폴더 만들기
mybatis.mapper-locations: mapper/*.xml

# 자바는 camel case, DB는 언더바를 설정
mybatis.configuration.map-underscore-to-camel-case=true

# 패키지 result tpye 을 생략할 수 있도록 entities(모델) 패키지 설정
mybatis.type-aliases-package=com.myapp.uglyMarket.entities

# mapper 로그레벨 설정 -> console에 INFO, WARN 같은걸 자세하게
logging.level.com.myapp.mybatis.mapper=TRACE
mybatis.type-aliases-package=com.myapp.uglyMarket.entities 부분 수정

 

 

 

mapper 폴더안에 [ RecipeMapper.xml ] 수정

- RecipeMapper 구현을 xml에서 한다.  (레시판 등록을 xml에서 코드 짜기)

<!-- 자바소스의 RecipeMapper의 경로 적용 -->
<mapper namespace="com.myapp.uglyMarket.dao.RecipeMapper">  
      <select id="enroll" resultType="RecipeVO">
             insert into recipe(title,ingredient,content,writer)
             values (#{title},#{ingredient},#{content},#{writer});
       </select>

※ dao = mapper 헷갈리지 않기!

-id에  [BoardMapper.java]의 메소드 enroll 을 넣는다
-resultType="RecipeVO" 결과는 RecipeVO로 리턴

-변수를 #{} 안에 넣기 작은따옴표는 없앤다!

 

 

 


 

▶  jpa 는 자동으로 됐지만 이건 테스트를 해줘야한다.

 

 


1. pom.xml에 마이바티스 테스트 추가

<!-- 마이바티스 테스트 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter-test</artifactId>
    <version>2.2.2</version>
    <scope>test</scope>
</dependency>

 

 

 

2. src/test/java 패키지 안에 dao패키지와 테스트할 RecipeMapper의 Test클래스 만들기 

 

 

 

 

3. BoardMapper를 테스트할 클래스 만들어줌 → Run as => Junit TEST 

 

- 필요한 어노테이션

 @MybatisTest
 @AutoConfigureTestDatabase(replace = Replace.NONE)    실제 DB(연결돼 있는)로 테스트
 @Rollback(value = false)  입력후 전으로 안돌아가기 위해 false  ? 

@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE) 
@Rollback(value = false) 
public class RecipeMapperTest {

	@Autowired
	private RecipeMapper recipeMapper;
	
	@Test
	public void test() {
		
		RecipeVO vo = new RecipeVO();
		vo.setTitle("제목테스트");
		vo.setIngredient("재료테스트");
		vo.setContent("내용테스트");
		vo.setWriter("글쓴이");
		
		recipeMapper.enroll(vo);
	}
}

 

 

 

Run as => Junit TEST  (오류없는지 확인)

 

 

- DB에도 들어갔는지 확인

 

 

 

 


 

 

 

controller로 바로 쓸수있지만 중간에 service가 들어간다.

 

 

 

3. 중간계층 RecipeService 

 

- service 패키지 안에 RecipeService 인터페이스 생성

public interface RecipeService {

	/* 게시판 등록 */
	public void enroll(RecipeVO board);
}

 

 

- RecipeService 구현하는 RecipeServiceImpl 클래스 생성 

 

필요한 어노테이션

@Service 

 

 

 

boardMapper를 가져와서 작성하는데 @Autowired 쓰는 대신 생성자 만들기

private RecipeMapper recipeMapper;

public RecipeServiceImpl(RecipeMapper recipeMapper) {
   this.recipeMapper = recipeMapper;
}

 

@Service
public class RecipeServiceImpl implements RecipeService{

	
	private RecipeMapper recipeMapper;
	
	public RecipeServiceImpl(RecipeMapper recipeMapper) {
		this.recipeMapper = recipeMapper;
	}

	@Override
	public void enroll(RecipeVO board) {
		recipeMapper.enroll(board);
	}

}

 

 

4. RecipeController 

service를 갖다쓴다.

 

어노테이션

@Controller
@RequestMapping("/recipe/board")
@Log  콘솔 로그 출력(print out 대신 사용)

@Controller
@RequestMapping("/recipe/board")
@Log //콘솔 로그 출력(print out 대신 사용)
public class RecipeController {

	@GetMapping("/list")
	public String recipeListGet() {
		log.info("게시판 리스트 페이지 진입");
		return "recipe_list";
	}
	
	@GetMapping("/enroll")
	public String recipeEnrollGet() {
		log.info("게시판 등록 페이지 진입");
		return "recipe_enroll";
	}
}

 

 

log.info를 써서 console에 찍히는지 테스트

@GetMapping("/list")
public String recipeListGet(){
  log.info("게시판 리스트 페이지 진입");
  return "recipe_list";
}

 

list.html을 안만들어서 에러는 나지만 그 전에 콘솔에 찍힌것을 확인할 수 있다.

 

 

 

 

5. 뷰페이지 

: 레시피 게시판 리스트 페이지와 등록페이지 만들기

 

[ recipe_list.html ]

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>레시피 게시판 리스트</title>
</head>
<body>
    <h1>목록 페이지</h1>
    <a th:href="@{/recipe/board/enroll}">게시글 등록</a>
</body>
</html>

 

[ recipe_enroll.html ]

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>레시피 게시판 등록</title>
</head>
<body>
    <h1>레시피 등록 페이지</h1>
</body>
</html>

※ thtmpl 쳐서 xmlns:th="http://www.thymeleaf.org" 복사하기

반응형
LIST

+ Recent posts