두 어노테이션을 알기 위해 먼저 스프링 컨테이너 구조와 빈(Bean)에 대해 알고 있어야 할 듯합니다. 컨테이너 구조는 모든 어플리케이션에서 사용하는 "루트 컨테이너", 각 서블릿이 사용하는 "서블릿용 컨테이너", 개발자가 임의로 생성해서 사용하는 "개발자용 컨테이너" 세 가지 종류가 있습니다. 컨테이너 이름은 정식 명칭이 아니라 그냥 제가 구분하기 위해 부르는 명칭입니다.
자세한 설명은 아래 글을 참조하시면 됩니다.
[Spring MVC/- 기본 상식] - 스프링(Spring) MVC 동작 구조 및 스프링 컨테이너

자세한 설명은 위 링크를 참조부탁드립니다.
@Contoller 어노테이션을 붙이면 핸들러가 스캔할 수 있는 빈(Bean) 객체가 되어 서블릿용 컨테이너에 생성됩니다. 마찬가지로 @Repository, @service 어노테이션은 해당 클래스를 루트 컨테이너에 빈(Bean) 객체로 생성해주는 어노테이션입니다.
둘 다 Bean 객체를 생성해주고 딱히 다른 기능을 넣어주는게 아니라서 뭘 써도 상관 없긴한데 명시적으로 구분해주기 위해 각자 분리해서 사용합니다. 부모 어노테이션인 @Component를 붙여줘도 똑같이 루트 컨테이너에 생성되지만 가시성이 떨어지기 때문에 잘 사용하지 않습니다.
참고로 객체 내에서 데이터 변경 작업이 있는 VO(DTO) 객체와 같은 경우는 동기화 문제로 인해 Bean 객체로 사용하지 않습니다. Bean 객체는 항상 데이터 변경이 없는 객체에 한해 사용하는 점에 유의해야 합니다.
컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)