- IntelliJ를 MySQL DB와 연결해보기
먼저 전에 받은 설정파일에서 root-context-DB연결 파일을 vscord로 열어
인텔리제이에 있는 root-context에 복사 붙여넣기 해줍니다
이후 각각의 붉은 선부분에 MySQL에서 만들어준 DB의 이름 , user계정 , password를 입력해주세요
(작은 오타가 있어도 웹이 열리지 않기 때문에 왠만하면 MySQL에서 복사하여 붙여넣어주세요!)
이렇게 DB와 user정보를 모두 입력했다면 아래 거슬리는 빨간 선을 제거해봅시다
저희가 만든 resources 폴더가 아닌!!
처음 프로젝트를 만들때 부터 있던 resurces 폴더에 파일 하나를 만들어주세요
파일의 이름은 mybatis-config으로 하겠습니다
이렇게 만들어진 mybatis-config 파일에도 마찬가지로 전에 받았던
설정 파일의 내용을 복사 붙여넣기 해줍니다
다음으로는 resources 폴더 안에 폴더하나를 만들겠습니다
폴더 명은 mapper로 지정하겠습니다
만들어진 mapper 폴더 안에 새로 파일을 하나 만들어주세요
저는 book의 정보를 담을 것이기 때문에 book-mapper로 만들었습니다
이후 다른 설정 파일들과 마찬가지로 전에 받은 설정 파일중
mapper 파일의 내용을 복사 붙여넣기 해주세요
이렇게 기본적인 DB연결 세팅이 모두 끝이 났습니다
- DB에 값 담기
이제 연동한 DB에 입력 받은 값을 넣어보겠습니다
실습에서 만든 save.jsp를 재활용하겠습니다
save.jsp에서는 입력받은 값을 form태그에서 /save에 파라미터 형식으로 전송합니다
Controller
@Controller
public class BookController {
@Autowired // BookService 의존성 주입 (필드 주입)
private BookService bookService;
@GetMapping("/save")
public String save(){
return "save";
}
인덱스에서 save로 넘어가기 위한 메소드
@PostMapping("/save")
입력값을 포스트 타입으로 받았기 때문에
Post 어노테이션 사용
public String saveParam(@ModelAttribute BookDTO bookDTO , Model model){
입력 받은 파라미터 값을 @ModelAttribute를 사용하여 바로 객체에 담아줍니다
int saveResult = bookService.save(bookDTO);
이렇게 객체에 담은 값을 Service 클래스의 save메소드에 매개변수로 넘겨줍니다
model.addAttribute("result",saveResult);
save메소드에서 리턴 받은 값을 Model 인터페이스를 이용해
saveResult.jsp에서 사용가능하게 만들어줍니다
return "saveResult";
saveResult에서는 model로 받은 값을 확인해
저장 결과를 script를 통해 확인후 alert로 팝업을 띄워줍니다
}
}
Service
@Service
public class BookService {
@Autowired // BookRepository 의존성 주입 (필드 주입)
private BookRepository bookRepository;
public int save(BookDTO bookDTO){
int result = bookRepository.save(bookDTO);
Controller의 메소드에서 받은 객체를
bookRepository에 매개변수로 넘겨줍니다
return result;
이후 받은 결과를 result에 담아 리턴해줍니다
}
}
Repository
@Repository
public class BookRepository {
@Autowired // MySQL 의존성 주입 (필드 주입)
private SqlSessionTemplate sql;
public int save(BookDTO bookDTO) {
return sql.insert("Book.save",bookDTO);
Book.save 는 어떤 맵퍼에 있는 어떤 쿼리문에 보낼건가 ,
bookDTO 자리는 실제 쿼리에 적용할 값
}
insert 수행결과를 int 로 리턴.
insert 수행이 되지 않았으면 0 , 됐으면 1
}
Mapper
<mapper namespace="Book"> <= Book이라는 맵퍼의
<insert id="save" parameterType="com.icia.lib.DTO.BookDTO"> <= save 쿼리문
parameterType으로 가져온 객체의 경로를 지정해주어야 합니다
insert into book_list(bookName,bookPublisher,bookAuthor,bookPrice)
values (#{bookName},#{bookPublisher},#{bookAuthor},#{bookPrice})
이후의 실행문은 실제 MySQL에서의 저장을 위한 쿼리문과 같습니다
차이점이 있다면 벨류를 저장할 때 #{벨류 값}으로 저장해줍니다
</insert>
</mapper>
- DB에 담은 값 list로 출력
index 화면에서 list로 이동하는 링크를 누르면
DB에 저장된 값을 표형식으로 화면에 출력합니다
Controller
@Controller
public class BookController {
@Autowired // BookService 의존성 주입 (필드 주입)
private BookService bookService;
@GetMapping("/list")
public String list(Model model){
List<BookDTO> bookDTOList = bookService.findAll();
List에 bookService클래스의 findAll메소드의 리턴값을 담아줍니다
model.addAttribute("bookDTOList",bookDTOList);
담은 정보를 model인터페이스에 담아줍니다
return "list";
list.jsp 화면으로 넘어갑니다
}
}
Service
@Service
public class BookService {
@Autowired // BookRepository 의존성 주입 (필드 주입)
private BookRepository bookRepository;
public List<BookDTO> findAll() {
리턴 타입은 List<BookDTO> 입니다
List<BookDTO> bookDTOList = bookRepository.findAll();
List<BookDTO> 에 bookRepository.findAll 로 List를 담아줍니다
if(bookDTOList.size() == 0){
return null;
}else {
return bookDTOList;
}
조건문 if를 사용하여 List의 size가 0이 아닐경우
정상적으로 리턴해줍니다
}
}
Repository
@Repository
public class BookRepository {
@Autowired // MySQL 의존성 주입 (필드 주입)
private SqlSessionTemplate sql;
public List<BookDTO> findAll() {
return sql.selectList("Book.findAll");
selectList를 사용하여
sql에서 DB에 저장된 정보를 가져와 리턴해줍니다
}
}
mybatis-config.xml
Mapper에서 한가지 DTO의 경로를 자주 설정해야할 때
mybatis-config.xml을 수정하여 쉽게 사용이 가능합니다
<configuration>
<typeAliases>
<typeAlias type="com.icia.lib.DTO.BookDTO" alias="book"></typeAlias>
자주 사용하는 경로를 type에 넣어주고 이름을 정해 사용합니다
</typeAliases>
</configuration>
Mapper
<mapper namespace="Book">
<select id="findAll" resultType="book">
book맵퍼에 있는 findAll쿼리문
resultType으로 리턴 타입을 저장할 DTO객체의 경로를 넣습니다
select * from book_list
MySQL의 실행문법대로 DB에 저장된 값을 모두 리턴합니다
</select>
</mapper>
- DB에 담긴 특정 값만 출력
list.jsp에서는 책번호와 제목만 출력하고 조회를 누르면
detail.jsp로 넘어가 해당 정보를 모두 출력합니다
MySQL에서 테이블을 만들때 primary key로 id를 고유한 값으로 만들었기 때문에
id를 매개로 사용하여 일치하는 정보의 값을 가져와 출력합니다
그렇기 때문에 해당 객체의 id값을 파라미터로 Controller에 넘겨줍니다
Controller
@Controller
public class BookController {
@Autowired // BookService 의존성 주입 (필드 주입)
private BookService bookService;
@GetMapping("/detail")
public String detail(@RequestParam("id") Long id,Model model){
@RequestParam을 파라미터의 id값을 받아옵니다
BookDTO bookDTO = bookService.select(id);
특정 하나의 객체 정보가 궁금하기 때문에 DTO객체로 정보를 받아줍니다
또한 , id값을 대조하여 맞는 정보를 가져와야 하기 때문에
파라미터에서 꺼낸 id값을 매개변수로 넘겨줍니다
model.addAttribute("bookDTO",bookDTO);
DB에서 받아온 객체를 model인터페이스에 담아
detail.jsp에서 출력문을 작성합니다
return "detail";
detail.jsp로 넘어갑니다
}
}
Service
@Service
public class BookService {
@Autowired
private BookRepository bookRepository;
public BookDTO select(Long id) {
BookDTO bookDTO = bookRepository.select(id);
Repositroy의 select 메소드에 id를 매개변수로 넘겨줍니다
if(bookDTO == null){
return null;
}else{
return bookDTO;
}
repository에서 받아온 객체의 값이 null이 아니라면
객체를 리턴해줍니다
}
}
Repository
@Repository
public class BookRepository {
@Autowired
private SqlSessionTemplate sql;
public BookDTO select(Long id) {
return sql.selectOne("Book.select",id);
Book 맵퍼에 있는 select 쿼리문에 id값을 전달합니다
}
}
Mapper
<mapper namespace="Book"> <=Book맵퍼
<select id="select" parameterType="Long" resultType="book"> <= select 쿼리문
저희가 가져온 id값은 파라미터에서 가져온 값이고 타입은 Long입니다
그렇기 때문에 parameterType="Long"을 사용하여,
매개로 전달받은 값이 Long타입임을 알려줍니다
select * from book_list where id=#{id}
실행문은 MySQL과 같지만 where 부분에 id = #{id}로
매개로 받아온 값을 넣어줍니다
이렇게 같은 ID값을 가지고 있는 정보를 모두
리턴해줍니다
</select>
</mapper>
'나의 수업일지' 카테고리의 다른 글
인천 일보 아카데미 46일차 -2- 배운 내용으로 만들어보기 (쇼핑몰 회원관리) / redirect 약간 이해함 (0) | 2023.04.27 |
---|---|
인천 일보 아카데미 46일차 -1- spring_framework / 수정 , 삭제 추가해보기 (0) | 2023.04.26 |
인천 일보 아카데미 45일차 -1- 실습 / MySQL - DB / table 만들기 (0) | 2023.04.25 |
인천 일보 아카데미 44일차 -2- ModelAttribute / 체크박스로 받은 값 담기 / @Service 알아보기 / 의존성 주입 - Autowired (0) | 2023.04.25 |
인천 일보 아카데미 44일차 -1- 실습 (0) | 2023.04.24 |