개발을 하다 보면 다양한 문제에 직면하게 되고, 이를 해결하기 위해 여러 프로그래밍 패러다임이나 디자인 패턴을 선택하게 됩니다. 이 글에서는 절차형 프로그래밍의 개념과 활용, 프록시 서버의 역할과 사용사례, 옵저버 패턴 구현 방법, 그리고 MVC와 MVVM 패턴의 차이에 대해 정리해보았습니다.
절차형(Procedural) 프로그래밍은 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있으며, 일이 진행되는 흐름대로 코드만 작성하면 되는 구조입니다. 절차형 프로그래밍은 계산이 많은 작업에 적합합니다. 예를 들어 머신러닝 파이프라인 같은 경우 연속적인 데이터 처리 흐름이 중요하므로 절차형 접근이 효율적일 수 있습니다.
public class Calculator {
public static void main(String[] args) {
int num1 = 10;
int num2 = 5;
int result = num1 + num2; // 연속적인 절차로 계산 수행
System.out.println("결과: " + result);
}
}
옵저버(Observer) 패턴은 객체 간의 일대다 의존성을 정의하여, 어떤 객체의 상태가 변경되었을 때 그에 의존하는 모든 객체에 알림이 가도록 하는 패턴입니다. 구현 방법 중 하나는 프록시 (Proxy)객체 사용하는 것입니다.
옵저버 패턴을 구현할 때 프록시 객체를 사용하면 유용합니다. 프록시를 통해 객체의 속성 변경이나 메서드 호출을 감지하고, 이를 미리 등록된 옵저버(구독자)에게 알릴 수 있습니다.
프록시 서버는 클라이언트와 실제 서버 사이에 위치하여, 중계 역할을 수행하는 서버입니다. 이를 통해 다양한 이점을 얻을 수 있습니다.
server {
listen 80;
location / {
proxy_pass http://localhost:3000; # Node.js 서버로 요청 전달
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
class Subject {
constructor() {
this.observers = [];
this.state = 0;
}
subscribe(observer) {
this.observers.push(observer);
}
setState(newState) {
this.state = newState;
this.notify();
}
notify() {
this.observers.forEach(observer => observer.update(this.state));
}
}
class Observer {
update(state) {
console.log(`옵저버 알림: 상태가 ${state}로 변경됨`);
}
}
// 사용
const subject = new Subject();
const observer1 = new Observer();
const observer2 = new Observer();
subject.subscribe(observer1);
subject.subscribe(observer2);
subject.setState(1);
MVC(Model-View-Controller)는 앱의 구성요소를 세 가지 역할로 분리하여 개발 효율을 높이는 디자인 패턴입니다.
// Model
class User {
private String name;
public User(String name) { this.name = name; }
public String getName() { return name; }
}
// View
class UserView {
public void printUserDetails(String userName) {
System.out.println("User: " + userName);
}
}
// Controller
class UserController {
private User model;
private UserView view;
public UserController(User model, UserView view) {
this.model = model;
this.view = view;
}
public void updateView() {
view.printUserDetails(model.getName());
}
}
// 사용
public class MVCPatternDemo {
public static void main(String[] args) {
User model = new User("David");
UserView view = new UserView();
UserController controller = new UserController(model, view);
controller.updateView();
}
}
MVVM(Model-View-ViewModel)은 MVC에서 Controller 대신 ViewModel을 사용하는 구조입니다.
프로그래밍 패러다임이나 디자인 패턴은 상황에 따라 적절히 선택하고 조합하는 것이 핵심입니다. 절차형이든 함수형이든, MVC든 MVVM이든 정답은 없습니다. 내가 해결해야 할 문제와 시스템의 성격을 이해하고 그에 맞는 도구를 쓰는 것이 가장 좋은 접근입니다.
참고 https://velog.io/@ryuhyewon/MVVM-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%9E%A5%EB%8B%A8%EC%A0%90