1. ๊ธฐ๋ณธ๊ตฌ์กฐ


์น ํ๋ฉด - Controller - Service - DAO - Mapper - DB
Controller : ํธ์ถ๋ URL์ ํตํ ๋ฐ์ดํฐ ์ ์ถ๋ ฅ
Service : DAO ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๋น์ฆ๋์ค ๋ก์ง ์ํ
DAO(Data Access Object) : DB ๋ฐ์ดํฐ์ ์ ๊ทผ, ๋ฐ์ดํฐ๋ฅผ ์ฝ์ , ์ญ์ , ์กฐํ ๋ฑ ํ ์ ์์.
Mapper : Mapping ํ์ผ์ ์๋ SQL์ ์๋ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํธ์ถํ ์ ์๋๋ก ํด์ค.
DTO(Data Transfer Object) : ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ ์ํ ๋ก์ง์ ๊ฐ์ง์ง ์๋ ๋ฐ์ดํฐ ๊ฐ์ฒด. getter, setter ๋ฉ์๋๋ง ๊ฐ์ง ํด๋์ค
Mapper: DAO ๋์ ์ธํฐํ์ด์ค๋ง์ ์ฌ์ฉํ์ฌ DB์ ์ ๊ทผํ ์ ์๋ค. (mybatis ์ฌ์ฉ ์ ์ฌ์ฉํจ.)
๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ์์ธํ ์ดํด๋ณด์.
* ๊ฐ๊ฐ ์ดํด๋ฅผ ์ํ ์์์ฝ๋์ผ ๋ฟ, ์๋ก 100% ์ฐ๊ด๋ ์ฝ๋๊ฐ ์๋.

SampleDAO, Sample Service : Interface๋ก ์์ฑ.
SampleDAOImPl , SampleServiceImpl : Class๋ก ์์ฑ.
Controller - Service - ServiceImpl - DAO - DAOImpl ์์ผ๋ก ํ์ผ์ ๋ถ๋ฌ์ค๋๋ฐ ๋์ํ๋ ์์
1. Controller
: ํ๋ฉด(์น ๋ธ๋ผ์ฐ์ )์์ ์์ฒญ๋๋ URL ๋งคํ์ ํตํด, ์ปจํธ๋กค๋ฌ์ ์ ๊ทผํด์ Service ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ค.
@Controller
: @Controller ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ ์ด ํด๋์ค๊ฐ ์ปจํธ๋กค๋ฌ ํด๋์ค ๋ผ๋ ๊ฒ์ ์๋ ค์ค๋ค.
์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ด ์ปจํธ๋กค๋ฌ๊ฐ ํธ์ถ๋๋ค.
@RequestMappring("/apple")
: baseurl/apple ๋ก ์ ์ํ๊ฒ ๋๋ฉด ์ด ์ด๋ ธํ ์ด์ ์ ๊ฐ์ง ๋ฉ์๋๋ก ๋งคํ์ด ๋๋ค.
@Controller //ํด๋น ํด๋์ค๋ฅผ ์ปจํธ๋กค๋ฌ๋ก ๋์ํ๊ฒ ํ๋ค.
public class BoardController {
@Autowired
private BoardService boardService;
@RequestMapping("/apple") // ์ด ์ฃผ์๋ก ์ ์ํ๋ฉด ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.(๋งคํํ๋ค.)
public ModelAndView openBoardList() throws Exception{
ModelAndView mv = new ModelAndView("/apple/boardList");
List<BoardDto> list = boardService.selectBoardList();
mv.addObject("list",list);
return mv;
}
}
[์ปจํธ๋กค๋ฌ ์์]
List<BoardDto> list = boardService.selectBoardList();
์ด ๋ถ๋ถ์ด Service๋ฅผ ํธ์ถํ๋ ๋ถ๋ถ์ด๋ค.
Service์ ๋ฐํ๊ฐ์ list ์ ์ ์ฅํ๊ณ ์๋ค.
๊ทธ๋ผ Service๋ฅผ ํธ์ถํ๋ฉด ์ด๋ป๊ฒ ๋์ํ๋ ์์ ๋ณด์.
2-1. Service
: ์ปจํธ๋กค๋ฌ์์๋ ์์ฒญ์ ๋ฐ์ Service์ ์ฃผ์ ํ๊ณ ,
Service๋ ์์ ์ด ์ํํด์ผ ํ ์๋น์ค๋ง ์งํํ๋ค.
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ก์ง์ ์์ฑํ๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ Service์์ ์์ ํ๋ค.
: ๋น์ฆ๋์ค ๋ก์ง(biz)์ ์ํํ๋ค.
DB์ ์ ๊ทผํ๋ DAO๋ฅผ ํตํด ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ์์จ๋ค.
* DAO๋์ ์ MyBatis์ Mapper์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ญ์ Service์ return์ ํตํด ๋งคํผ๋ฅผ ํธ์ถํ๋ค.
* BizImpl์์ Service ์ญํ ์ ํ ์ ์๋ค.
// interface๋ ๊ฐ๋ฐ ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ํต์ ํ๋ ์ ์ ์ญํ ์ ํจ
// ๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถ
public interface SampleService {
// Controller์์ ์ธ์์ ํจ๊ป ์ ๋ฌ๋ ๋ฉ์๋
List<SampleVO> selectSampleList(SearchConditionVO searchVO);
}
[sampleService]
Interface : ๊ฐ๋ฐ์ฝ๋์ ๊ฐ์ฒด๊ฐ ์๋ก ํต์ ํ๋ ์ ์ ์ญํ
๊ฐ๋ฐ ์ฝ๋๊ฐ ์ธํฐํ์ด์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
์ด๋ ๋ฉ์๋๋ ์ปจํธ๋กค๋ฌ์์ ์ธ์์ ํจ๊ป ์ ๋ฌ๋ ๋ฉ์๋์ด๋ค.
// Service๋ฅผ ์ธ์์์ผ์ฃผ๊ธฐ ์ํ ์ค์
@Service("sampleService")
public class SampleServiceImpl implements SampleService {
// SampleDAO ๋ก ์ฐ๊ฒฐ์ ํ๊ธฐ ์ํ ์ ์ธ
@Autowired
private SampleDAO sampleDao;
// Controller์์ ๋ฐ์์จ selectSampleList์ ๋ฉ์๋๋ฅผ SampleDAO์ selectSampleList ๋ฉ์๋ ์ ๋ฌ
// ๊ฒฐ๊ณผ๋ก ์ป์ ๋ฐํ๊ฐ์ return์ ํตํด ๋ค์ Controller๋ก ์ ๋ฌ
@Override
public List<SampleVO> selectSampleList(SearchConditionVO searchVO) {
return sampleDao.selectSampleList(searchVO);
}
}
[SampleServiceImpl]
@Autowired : SampleDAO๋ก ์ฐ๊ฒฐ์ ํ๊ธฐ ์ํ ์ ์ธ
์ปจํธ๋กค๋ฌ์์ ๋ฐ์์จ selectSampleList์ ๋ฉ์๋๋ฅผ SampleDAO์ selectSampleList ๋ฉ์๋ ์ ๋ฌ
๊ฒฐ๊ณผ๋ก ์ป์ ๋ฐํ๊ฐ์ return์ผ๋ก ๋ค์ ์ปจํธ๋กค๋ฌ์ ์ ๋ฌํ๋ค.
2-2. BizImpl , Biz
: Service ๋์ BizImpl, Biz์ ์ฌ์ฉํ์ฌ DAO(or Mapper)์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
@Service("-") : Service์ฉ๋๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์ด๋ ธํ ์ด์
@AutoWired : ์์กด์ฑ ์ฃผ์ ์ ์ํ ์ด๋ ธํ ์ด์
์์กด ๊ฐ์ฒด์ ํ์ ์ ํด๋นํ๋ ๋น(bean)์ ์ฐพ์ ์ฃผ์ ํด์ค๋ค.
@Transactional : ํ๋์ ํจ์๊ฐ ํ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ๋ฒ์ ์์์ ์คํ๋์ด์ผ ํจ์ ๋ช ์ํ๋ค.
๋ง์ฝ, ๋ฉ์๋์ ์ ์ฉํ๋ฉด SpringBoot๊ฐ ํด๋น ๋ฉ์๋๋ฅผ ์์ํ ๋ ํธ๋์ญ์ ์ ์์ํ๋ค.
๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ํธ๋์ญ์ ์ COMMIT, ๋ง์ฝ ๋์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ROLLBACK ํ๋ค.
ROLLBACK์ด ๋ฐ์ํ์๋, ํธ๋์ญ์ ์ ์ผ๋ถ ์์ ๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํด์ ๋ฐ์ดํฐ์ผ๊ด์ฑ์ ์ ์งํ ์์๋ค.
๋ฉ์๋ or ํด๋์ค ๋จ์์ ์ ์ธ,
ํด๋์ค์ ์ ์ธํ๋ฉด, ํด๋น ํด๋์ค์ ์ํ๋ ๋ฉ์๋์ ๊ณตํต์ ์ผ๋ก ์ ์ฉ๋๋ค.
๋ฉ์๋์ ์ ์ธํ๋ฉด, ํด๋น ๋ฉ์๋์๋ง ์ ์ฉ๋๋ค.
*์ผ๋ฐ์ ์ผ๋ก @Transactional์ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋น์ค ๋ ์ด์ด์์ ์ฌ์ฉํ๋ค.
@Service("ํ์")
public class PowerBizImpl implements ProductBiz<PowerDto> {
@Autowired
private ProductMapper productMapper;
@Autowired
private PowerMapper powerMapper;
@Override
public List<PowerDto> selectAll() {
return null;
}
@Override
public PowerDto selectOne(int product_code) {
return null;
}
@Override
@Transactional
public int insert(PowerDto dto) {
System.out.println("Biz : " + dto);
int result = 0;
try {
result = productMapper.insertProduct(dto);
System.out.println("Biz : " + result);
int productCode = productMapper.getCurrentProductCode();
dto.setProduct_code(productCode);
result += powerMapper.insertPower(dto);
System.out.println("Biz : " + result);
} catch (Exception e) {
System.err.println("Error during insert: " + e.getMessage());
throw e;
}
return result;
}
}
3-1. DAO
: DB์ ์ ์ํ์ฌ ๋น์ฆ๋์ค ๋ก์ง ์คํ์ ํ์ํ ์ฟผ๋ฆฌ๋ฅผ ํธ์ถํ๋ค.
: DAO ๋์ ์ mybatis์ Mapper์ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
public interface SampleDAO {
// ServiceImpl์์ ์ธ์์ ํจ๊ป ์ ๋ฌ๋ ๋ฉ์๋
List<SampleVO> selectSampleList(SearchConditionVO searchVO);
}
[ SampleDAO ์ ์ฒด ์ฝ๋ ]
//DAO๋ฅผ ์ธ์์์ผ์ฃผ๊ธฐ ์ํ ์ค์
@Repository("sampleDao")
public class SampleDAOImpl implements SampleDAO {
// mybatis๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฒด ์ ์ธ
@Autowired
private SqlSessionTemplate mybatis;
// mybatis.์์ฑ("[mapper namespace].[select id]",[์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ VO])
@Override
public List<SampleVO> selectSampleList(SearchConditionVO searchVO) {
// select๋ฅผ ์ํ mybatis์ selectList ์์ฑ์ ์ฌ์ฉํ์ฌ mapper์ sql๋ฌธ์ ์คํ์ํจ ํ ๊ฐ์ ๋๋ฐ๊ณ
// Controller์ ์ฃผ๊ธฐ ์ํ return ์์
return mybatis.selectList("SampleMapper.selectSampleList", searchVO);
}
}
[ SampleDAOImpl ์ ์ฒด ์ฝ๋ ]
@Autowired : SqlSessionTemplate์ผ๋ก ์ฐ๊ฒฐ์ ํ๊ธฐ ์ํ ์ ์ธ
3-2. Mapper
: Mybatis ๋ฅผ ์ฌ์ฉํด ๋งคํผ๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์ ๊ทผํ ์ ์์ด์ง๋ค.
์ด ๊ฒฝ์ฐ, DAO๋์ Mapper๋ฅผ ์ฌ์ฉํ๋ค.
: ๋งคํผ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ผ์ผ์ด DAO๋ฅผ ๋ง๋ค์ง ์๊ณ ์ธํฐํ์ด์ค๋ง์ ์ด์ฉํด ๋ ํธํ๊ฒ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
๋ํ, SQL๋ฌธ์ JAVA์ฝ๋์ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ํด๋จผ์๋ฌ๋ฅผ ๋ง์์ค ์ ์๋ค.
4. DTO
: ๊ฐ ๊ณ์ธต(controller, view, service, DAO, DB)์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด
: getter, setter ๋ฉ์๋๊ฐ ์๋ ๊ณณ.
package com.boot.selftop_web.order.model.dto;
public class OrderBoardDto {
private int order_no;
private int seller_no;
private int customer_no;
private String address;
private String request;
private String reason;
private String name;
private String phone;
public OrderBoardDto() {}
public OrderBoardDto(int order_no, int seller_no, int customer_no, String address, String request, String reason,
String name, String phone) {
super();
this.order_no = order_no;
this.seller_no = seller_no;
this.customer_no = customer_no;
this.address = address;
this.request = request;
this.reason = reason;
this.name = name;
this.phone = phone;
}
public int getOrder_no() {
return order_no;
}
public void setOrder_no(int order_no) {
this.order_no = order_no;
}
public int getSeller_no() {
return seller_no;
}
public void setSeller_no(int seller_no) {
this.seller_no = seller_no;
}
public int getCustomer_no() {
return customer_no;
}
public void setCustomer_no(int customer_no) {
this.customer_no = customer_no;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getRequest() {
return request;
}
public void setRequest(String request) {
this.request = request;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
[DTO ์์]