Tiny Bunny
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป/SpringBoot

[Spring Boot] Controller, Service, DAO, Mapper, DTO ์ •๋ฆฌ

by soonybutter 2024. 12. 25.
728x90

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 ์˜ˆ์‹œ]

728x90

TOP

Designed by ํ‹ฐ์Šคํ† ๋ฆฌ