(loop (print (eval (read))))

;;닭집을 차리기 위한 여정

서비스 레이어가 *정말로* 필요한가?

간단하게 할 수 있으면 간단하게 해라.

맞지 않나? 간단히 할 수 있는일을 왜 안 간단하게 하는지 모르겠다.
무슨 디커플링 어쩌구 하는데, 단 한번 쓰일 메서드 내지는 다음에 쓰일지 말지 애매한 메서드까지 왜 서비스 레이어 위에 올리는걸까?
왜 소스코드를 늘리고 더 복잡하게 만드는걸까? 이해가 안된다.
간단히 Authentication 만 봐도 그렇다. 인증 과정이 여러 포인트에서 지금 당장 일어나고 있다면 모를까, 최초 코드 작성시점에서 벌써 그런 사정을 고려할 필요는 없다.
이게 스프링 커뮤니티에서 추천하는 jdk프록시와 만나 impl 서비스 레이어를 만드는 것으로 더 복잡해진다.

LoginController -> LoginService -> LoginServiceImpl -> UserDao -> UserMapper

컨트롤러에 비즈니스 로직을 집어넣는것이 나쁘다 (내지는 바람직하지 않다) 고 하는게 널리 알려진 말이지만,
지금껏 경험한 바로는 그런 말이 이해가 안될정도로, 그저 똑같은 메서드를 가진 서비스 클래스를 하나 더 만들뿐이다.

어떤 개념을 하나 더 두는것이 아무리 일정한 컨벤션을 가지고 있고 나중에 쓸모가 있을지도 모른다 할지라도 가장 좋은건 그냥 없는게 가장 좋지 않나?

예를들면 인증은 그냥 이런 코드로도 충분하지 않나 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@Controller
public class RootController {
@Resource(name = "session")
Session session;
@Inject
UserMapper userMapper;
@Inject
PostMapper postMapper;
@Inject
FooService fooService;
@RequestMapping("/")
public String root() {
if (session.getUser() == null)
return "redirect:/page/hello";
else
return "redirect:/page/home";
}
@Authorized(to = Type.PUBLIC)
@RequestMapping("/page/hello")
public String hello() {
return "/jsp/hello.jsp";
}
@RequestMapping("/page/home")
public ModelAndView home() {
List<Post> posts = postMapper.select();
return new ModelAndView("/jsp/home.jsp").addObject("posts", posts);
}
@Authorized(to = Type.PUBLIC)
@RequestMapping("/proc/login")
public String login(
@RequestParam(required = true) String name,
@RequestParam(required = true) String password
) {
User user = userMapper.selectByLogin(name, password);
if (user == null)
throw new NoSuchUserException();
session.setUser(user);
return "redirect:/";
}
@RequestMapping("/proc/logout")
public String logout() {
session.setUser(null);
return "redirect:/";
}
}