스프링과 JSP의 데이터 흐름 (DB기준)
-JSP
DB->mapper.xml - > DAO ->Controller
-Spring
DB-mapper.xml->Mapper 인터페이스 ->Service ->Controller
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;
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;
}
}
@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을 사용하여 파라미터가 없는 기본 생성자를 자동으로 생성하는 역할을 합니다.
<?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 매핑 구문에서 해당 별칭을 사용하여 클래스를 참조할 수 있습니다.
<?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을 통해 삭제할 수 있게 만들었다.
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 문장을 실행하고, 그 결과를 자바 객체로 반환하거나 데이터베이스에 영향을 줍니다.
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);
}
}
@Testvoid insert() {
MemberDto memberDto = new MemberDto();
memberDto.setMemberAge(28);
memberDto.setMemberName("김철수");
memberMapper.insert(memberDto);

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

81번의 저장정보가 나온다.
@Test
void update(){
MemberDto memberDto=new MemberDto();
memberDto.setMemberNumber(81L);
memberDto.setMemberName("치킨");
memberMapper.update(memberDto);
}
}
UPDATE문을 이용하여

이름을 바꿀 수 있다.