개발성장일지

서브도메인 로컬환경 띄우기(1)

izzySnow 2026. 3. 28. 11:57

 

서브 도메인이란?


우리가 흔히 아는 도메인은 
www.tistory.com

이런 메인도메인이다.

 

하지만 내 블로그의 주소는 
izzy9215.tistory.com

다른 사람의 티스토리 도메인 주소 역시 아이디를 앞에 두고 있는 서브도메인 형태를 가지고있다. 

 

현재상황

현재 개발하는 사이트에서도 메인도메인1개에 1개 이상의 서브도메인을 사용해서 개발해야하는 상황이 생겼다. 

이전에는 컨텍스트 패스로 나뉘었던 사이트가 명확한 사용자의 구분을 나누고자 서브도메인 사용으로 전환한것이다. 

 

OLD)
MYDOMAIN.com/admin/login
MYDOMAIN.com/user/login
MYDOMAIN.com/partner/login

NEW)

admin.MYDOMAIN.com/login
user .MYDOMAIN.com/login

partner .MYDOMAIN.com/login

 

 

이러다 보니 controller 의 url mapping 이 겹치게되었다. 

@Controller
@RequestMapping("/login")
public class AdminLginViewCntr {

    @GetMapping("")
    public String adminLoginView() {

        return "/admin/adminLgin";
    }
}

 

@Controller
@RequestMapping("/login")
public class UserLginViewCntr {

    @GetMapping("")
    public String userLoginView() {

        return "/user/userLgin";
    }
}

 

@Controller
@RequestMapping("/login")
public class PartnerLginViewCntr {

    @GetMapping("")
    public String partnerLoginView() {

        return "/partner/PartnerLgin";
    }
}

 

 

 

이렇게되면 스프링은 중복된 URL 매핑으로 인한 오류를 뱉어내고 

 

admin.MYDOMAIN.com/ad/login
user .MYDOMAIN.com/us/login
partner .MYDOMAIN.com/pa/login

 

로 url 을 바꿔야하나 라는 쉽고 빠른 유혹에 빠지게 된다. 

 

하지만 이건 내가 원하는 방식이 아니고 개발계에서 배포할때는 각 폴더별로 배포 제외 경로를 지정하기로 결정했기때문에 로컬에서 사용할 수 있는 방법을 찾아야했다. 

 

쉽게 생각할 수 있는 환경은 개발계 환경과같이 로컬 환경의 서버를 3개 띄우는 것이다. 

하지만 인간의 욕심은 끝이없고 나는 해보겠다는 마음으로 서치에 들어갔다. 

 

방법1. host 탐지 후 화면 분기

 

C:\Windows\System32\drivers\etc\hosts 파일 아래 추가 

(관리자 권한으로 실행)

127.0.0.1 admin.localhost
127.0.0.1 user.localhost
127.0.0.1 partner.localhost

@RequestMapping("/login")
public class LginViewCntr {

    @GetMapping("")
    public String loginView(HttpServletRequest request) {
        String host = request.getServerName();

        if (host.contains("admin")) {
            return "/admin/adminLgin";
        } else if (host.contains("user")) {
            return "/user/userLgin";
        } else if (host.contains("partner")) {
            return  "/partner/partnerLgin";
        }

        return "redirect:/";
    }

 

첫 실행은 효과적이었다. 

하나의 서버로 3개의 포탈을 로그인 시킬 수 있다니 아주나이스!

 

문제는 그 다음이다... 로그인컨트롤러야 배포시 공통 폴더로 배포하면 되지만 다른 viewController 까지 이렇게 만들기에는 각 포털마다 화면들이 상이하기 때문이다.

 

결국이 방법은 로그인만 해결하고 로컬 서버 돌리기는 원점으로 돌아간다. 

 

방법2. 로컬 서버를 개발환경과 비슷하게 띄우기 (3개 의 서버를 띄우기) 

 

이 내용은 아직 시도중이고 확정이 안되어서 다음에 이어서 작성하도록 하겠다.

 

개발 뿐만 아니라 아키텍처적 사고를 하게된건가 싶은 요즘이다. 

 


다음편 예고 
1. 
👉 Filter / Interceptor에서 portal 구분
String host = request.getServerName();request.setAttribute("portal", "admin");
→ 이후 Controller는 공통 사용
2. 
👉 Nginx에서 분기
admin.domain.com → /adminuser.domain.com → /user
→ Spring은 그냥 context path처럼 동작
3. 
👉 서버 여러 개