Controller, Service, Repository ?

매니·2022년 9월 22일
0
post-thumbnail

9월 21일자, 면접에서 Controller, Service, Repository 의 차이점을 설명해달라고 하셨는데, 머리가 하얘지는 경험을 했다. 분명 내가 사용하긴 했는데 정확한 의미를 모르겠어서 경험상 컨트롤러는 uri를 가공하여 웹에 뿌리는거라고 했고 service는 실질적인 로직이 들어가는 것이라고 했고 repository는 깃의 레파지토리..? 이난리 치면서 결국 모른다고 답했다.

분명!! 저걸 썻는데!! 왜 나는 기억을 못하나? 의 포스팅입니다.


실제로 제가 작업했던 YoriZori의 파일 구조입니다.

CommonDAO, MybatisDaoImpl = Repository
RecipeController = Controller
RecipeService, RecipeServiceImpl = Service

제가 작업했던 파일에서는 Repository 는 없었습니다.. DAO가 Repository 였던 겁니다..

그래서 제가 Repository 가 뭔가요? 라는 질문에 멘붕이 온겁니다...

CommonDAO와 MybatisDaoImpl를 간단히 살펴보자면,

버젓이 @Repositoy("dao") 라는 어노테이션이 보입니다.

분명 프로젝트 당시에 이것을 이해하기 위해서 엄청 노력했던 것으로 기억하는데 역시, 사람은 기록해놔야 기억합니다.

아래에서 자세히 YoriZori를 코드를 분석하며 설명하도록 하겠습니다.

관계

간단하게 관계에 대해서 알아보자면

View 에서 정보를 전송하면 이 정보를 Controller 에서 Service에서 받고 Repository 를 통해 DB에 저장됩니다.

그리고 저장된 정보를 View에 어떻게 되었는지 다시 보내주죠.

Controller

간단히 관계에 대해서 알아보았는지 각각 깊이있게 알아봅시다.

@Controller("recipe.recipeController")
@RequestMapping("/recipe/*")
public class RecipeController {
 	@RequestMapping(value = "write", method = RequestMethod.POST)
    public String writeSubmit(Recipe dto, HttpSession session) throws Exception {

        String root = session.getServletContext().getRealPath("/");
        String path = root + "uploads" + File.separator + "recipe";

        SessionInfo info = (SessionInfo) session.getAttribute("member");

        try {
            dto.setUserId(info.getUserId());
            service.insertRecipe(dto, path);
         } catch (Exception e) {
         }

        return "redirect:/recipe/feed";
    }
 }

위의 코드는 실제로 YoriZori RecipeController 에서 사용했던 레시피 등록코드 입니다.

Controller 에서는 Recipe dto, HttpSession session 을 통해서 서버에서 받은 정보를 받아줍니다.

그리고 service.insertRecipe(dto, path); 를 통해서 DB에 저장해줍니다.

Controller 은 uri을 정하고 서버에서 받은 정보를 service 로 넘겨주는 일을 합니다.

Controller 에서 Service로 데이터를 넘겼으니, Service 로 넘어가봅시다.

Service

public interface RecipeService {
	// 레시피 등록
	public void insertRecipe(Recipe dto, String pathname) throws Exception;
}

Service 는 추상화 작업을 위해 인터페이스로 만들어줍니다.

@Service("recipe.recipeService")
public class RecipeServiceImpl implements RecipeService {

	@Autowired
	private CommonDAO dao;
	
	@Autowired
	private FileManager fileManager;
	
	@Override
	public void insertRecipe(Recipe dto, String pathname) throws Exception {
		try {
			int seq = dao.selectOne("recipe.recipeseq");
			dto.setRecipeNum(seq);
			
			String saveFilename = fileManager.doFileUpload(dto.getSelectFile(), pathname);
			if(saveFilename != null) {
				dto.setImageFilename(saveFilename);
				
				dao.insertData("recipe.insertRecipe", dto);
				dao.insertData("recipe.insertRecipePhoto", dto);
				
				for (Integer insertingredient : dto.getIngredientCodes()) {
					dto.setIngredientCode(insertingredient);
					
					dao.insertData("recipe.insertingredientList", dto);
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
	}
 }

Service 에서는 controller 에서 데이터를 받아서 dao의 메소드를 불러와서 데이터들을 넘겨주고 있습니다.

실제 로직적으로 작동하는 것 입니다.

이제 이것을 받은 dao로 넘어가줍니다.

Repository

@Repository("dao")
public class MyBatisDaoImpl implements CommonDAO {
	@Autowired
	private SqlSession sqlSession;
	
	private final Logger logger=LoggerFactory.getLogger(getClass());
	
	// 데이터 추가
	public int insertData(String id) throws Exception {
   		int result = 0;

		try {
			result = sqlSession.insert(id);
		} catch (Exception e) {
			logger.error(e.toString());
			
			throw e;
		} finally {
		}
		
		return result;
    }
 }

dao를 살표보면 실질적으로 insertDate 메소드를 통해 sqlSession 을 이용해서 데이터를 넣고 있습니다.

Repository 와 DB가 연결되는 것 입니다.

한마디로, Repository 는 DB와 연결되서 데이터를 받아서 넣어주는 것이라고 생각하면 될 것 같습니다.

💡 I Learned

면접에서 Repository 가 뭐지? 깃...레파지토리 이랬지만 오늘 이후로는 자신있게 대답할 수 있습니다.

또한, YoriZori 코드를 보면서 실제로 사용했던 어노테이션이나 파일 구조들에 대해서 좀 더 학습할 수 있었고 정의와 개념에 대해서 확립할 수 있었습니다.

면접에서 대답하지 못했던게 너무나도 아쉽지만... 그래도 다시는 이런 실수 하지 않을 테니깐 좋게 넘어가보려고 합니다.

profile
성장중 🔥

0개의 댓글