Spring CRUD TEST

정키·2023년 5월 25일

Spring

목록 보기
3/3

스프링과 JSP의 데이터 흐름 (DB기준)

-JSP

DB->mapper.xml - > DAO ->Controller

-Spring

DB-mapper.xml->Mapper 인터페이스 ->Service ->Controller

0 > DB

CREATE TABLE TBL_MEMBER(
                           MEMBER_NUMBER NUMBER,
                           MEMBER_NAME VARCHAR2(1000),
                           MEMBER_AGE NUMBER,
                           CONSTRAINT PK_MEMBER PRIMARY KEY (MEMBER_NUMBER)
);

CREATE SEQUENCE SEQ_MEMBER;

1> Dto (MemberDto)

package com.example.ex01.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@Data
@NoArgsConstructor
public class MemberDto {
    private Long memberNumber;
    private String memberName;
    private Integer memberAge;


    public void setMemberNumber(Long memberNumber) {
        this.memberNumber = memberNumber;
    }
}

@Dto

@Component 어노테이션은 Spring 프레임워크에서 사용되는 어노테이션 중 하나입니다. 이 어노테이션은 Spring 컨텍스트에 해당 클래스를 빈(Bean)으로 등록하고, 해당 빈을 자동으로 생성하고 관리하는 역할을 합니다.

@Component 어노테이션을 클래스 위에 붙여주면 Spring은 해당 클래스를 컴포넌트로 인식하고, Spring 컨텍스트에 등록합니다. 이렇게 등록된 컴포넌트는 다른 컴포넌트나 서비스에서 주입(Dependency Injection)하여 사용할 수 있습니다.

@Data 어노테이션은 Lombok이라는 라이브러리에서 제공하는 어노테이션입니다. 이 어노테이션을 사용하면 클래스 내에 Getter, Setter, equals(), hashCode(), toString() 등의 메서드를 자동으로 생성해줍니다. 이를 통해 코드의 가독성을 향상시키고, 개발자가 반복적으로 작성해야하는 메서드를 줄일 수 있습니다.

@NoArgsConstructor 어노테이션은 Lombok에서 제공하는 다른 어노테이션입니다. 이 어노테이션을 클래스 위에 붙여주면 파라미터가 없는 기본 생성자를 자동으로 생성해줍니다. Spring에서는 기본 생성자를 사용하여 빈을 생성하는 경우가 많기 때문에, @NoArgsConstructor 어노테이션은 Spring과 Lombok을 함께 사용할 때 유용하게 활용될 수 있습니다.

요약하자면, @Component는 Spring 컨텍스트에 해당 클래스를 빈으로 등록하는 역할을 하고, @Data는 Lombok을 사용하여 Getter, Setter, equals(), hashCode(), toString() 등의 메서드를 자동으로 생성하는 역할을 합니다. @NoArgsConstructor는 Lombok을 사용하여 파라미터가 없는 기본 생성자를 자동으로 생성하는 역할을 합니다.

2>config

conifg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <typeAliases>
        <typeAlias type="com.example.ex01.dto.MemberDto" alias="memberDto"/>
    </typeAliases>
</configuration>

해당 코드는 MyBatis 프레임워크에서 사용되는 XML 설정 파일에서 요소를 정의하는 부분입니다. MyBatis는 SQL 매핑을 위해 Java 객체와 데이터베이스 테이블 간의 매핑을 지원하는 ORM(Object-Relational Mapping) 프레임워크입니다. 는 이 매핑을 위해 Java 클래스의 별칭을 설정하는 데 사용됩니다.

type 속성은 별칭을 설정할 Java 클래스의 전체 경로를 나타냅니다. 해당 예시에서는 com.example.ex01.dto.MemberDto 클래스를 별칭으로 지정하고자 합니다.

alias 속성은 해당 클래스에 대한 별칭을 정의합니다. 여기서는 memberDto라는 별칭을 지정했습니다. 이 별칭은 MyBatis XML 설정 파일에서 SQL 매핑 구문에서 해당 클래스를 참조할 때 사용됩니다.

이렇게 요소를 사용하면 MyBatis 설정 파일에서 별칭을 지정하여 코드의 가독성을 높일 수 있고, SQL 매핑 구문에서 해당 별칭을 사용하여 클래스를 참조할 수 있습니다.

3> resource -MemberMapper.XML

XML

  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.ex01.mapper.MemberMapper">
    <insert id="insert" parameterType="memberDto">
        insert into TBL_MEMBER (MEMBER_NUMBER, MEMBER_NAME, MEMBER_AGE)
        values (SEQ_MEMBER.NEXTVAL,#{memberName},#{memberAge})
    </insert>

    <select id="select" parameterType="long" resultType="memberDto">
       SELECT MEMBER_NUMBER, MEMBER_NAME,MEMBER_AGE
        FROM TBL_MEMBER
        WHERE MEMBER_NUMBER=#{memberNumber}
    </select>

    <select id="selectAll" resultType="memberDto">
        SELECT MEMBER_NUMBER, MEMBER_NAME,MEMBER_AGE
        FROM TBL_MEMBER
    </select>
    <update id="update">
        UPDATE TBL_MEMBER
        SET  MEMBER_NAME =#{memberName}
        WHERE MEMBER_NUMBER =#{memberNumber}
    </update>

    <delete id="delete">
        DELETE FROM TBL_MEMBER
        WHERE MEMBER_NUMBER=#{memberNumber}
    </delete>

</mapper>

INSERT를통해 MEMBER_NUMBER, MEMBER_NAME, MEMBER_AGE값을 넣고
MemberNumber로 SLECET를 한다.
그리고 전체를 SELECT하고싶으면 SELECT문에서 WHERE조건문을 제외하면 된다.
DELETE삭제도 MemberNumber을 통해 삭제할 수 있게 만들었다.

4.java - MemberMapper interface

MemberMapper interface

package com.example.ex01.mapper;
import com.example.ex01.dto.MemberDto;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface MemberMapper {
   public void insert(MemberDto memberDto);
   public MemberDto select(Long memberNumber);
   public List<MemberDto> selectAll();
   public void update(MemberDto memberDto);
   public void delete(Long memberNumber);
}

위의 코드는 MyBatis에서 사용되는 매퍼 인터페이스를 정의하는 부분입니다. MyBatis에서는 SQL 매핑을 위해 XML 파일과 매퍼 인터페이스를 조합하여 사용합니다. 이를 통해 SQL 쿼리를 자바 코드에서 메서드로 호출하여 실행할 수 있습니다.

package com.example.ex01.mapper;는 해당 매퍼 인터페이스의 패키지를 지정하는 부분입니다.

import com.example.ex01.dto.MemberDto;는 매퍼에서 사용할 DTO(Data Transfer Object) 클래스인 MemberDto를 가져오는 부분입니다. DTO 클래스는 데이터베이스의 특정 테이블과 매핑되는 데이터 객체를 나타냅니다.

@Mapper 어노테이션은 해당 인터페이스가 MyBatis 매퍼 인터페이스임을 표시하는 역할을 합니다. 이 어노테이션을 통해 MyBatis는 인터페이스를 스캔하여 SQL 매핑을 수행할 수 있습니다.

public interface MemberMapper는 Member 매퍼 인터페이스를 선언하는 부분입니다. 이 인터페이스는 MemberDto와 관련된 CRUD(Create, Read, Update, Delete) 작업을 수행하는 메서드들을 정의하고 있습니다.

각 메서드는 다음과 같은 역할을 수행합니다:

public void insert(MemberDto memberDto): MemberDto를 새로운 레코드로 데이터베이스에 삽입합니다.

public MemberDto select(Long memberNumber): 주어진 회원 번호에 해당하는 MemberDto를 데이터베이스에서 조회합니다.

public List selectAll(): 데이터베이스의 모든 MemberDto를 조회하여 리스트로 반환합니다.

public void update(MemberDto memberDto): 주어진 MemberDto로 데이터베이스의 레코드를 업데이트합니다.

public void delete(Long memberNumber): 주어진 회원 번호에 해당하는 MemberDto를 데이터베이스에서 삭제합니다.

이렇게 정의된 매퍼 인터페이스는 MyBatis의 XML 설정 파일에서 SQL 매핑 구문을 작성하여 데이터베이스와 상호작용할 수 있게 해줍니다. 매퍼 인터페이스의 메서드는 XML 파일에서 매핑되는 SQL 문장을 실행하고, 그 결과를 자바 객체로 반환하거나 데이터베이스에 영향을 줍니다.

5. Test

package com.example.ex01.mapper;

import com.example.ex01.dto.MemberDto;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@Slf4j
class MemberMapperTest {
  @Autowired
  private MemberMapper memberMapper;


  @Test
  void insert() {
      MemberDto memberDto = new MemberDto();
      memberDto.setMemberAge(28);
      memberDto.setMemberName("김철수");


      memberMapper.insert(memberDto);

  }
  @Test
  void select(){
      MemberDto memberDto=memberMapper.select(21L);

      log.info(memberDto.toString());

  }
  @Test
  void selectAll(){
      List<MemberDto> memberDtoList=memberMapper.selectAll();

      for (int i=0; i<memberDtoList.size(); i++){
          log.info(memberDtoList.get(i).toString());
      }
      for(MemberDto memberDto : memberDtoList){
          log.info(memberDto.toString());
      }
  memberDtoList.stream().forEach(memberDto ->log.info(memberDto.toString()));
  }
  @Test
  void update(){
      MemberDto memberDto=new MemberDto();
      memberDto.setMemberNumber(21L);
      memberDto.setMemberName("치킨");
      memberMapper.update(memberDto);
  }

}

TEST문을 실행하면 DB에 저장이 된다

@Test 

void insert() {
MemberDto memberDto = new MemberDto();
memberDto.setMemberAge(28);
memberDto.setMemberName("김철수");

  memberMapper.insert(memberDto);

이 저장된 정보를 꺼내오려면 SELECT문을 사용하여 81번 정보를 꺼내오면

@Test
void select(){
    MemberDto memberDto=memberMapper.select(81L);

    log.info(memberDto.toString());

81번의 저장정보가 나온다.

이 81번의 정보를 UPDATE하기위해서는


   @Test
    void update(){
        MemberDto memberDto=new MemberDto();
        memberDto.setMemberNumber(81L);
        memberDto.setMemberName("치킨");
        memberMapper.update(memberDto);
    }

}

UPDATE문을 이용하여


이름을 바꿀 수 있다.

profile
bbbu

0개의 댓글