AI딥러닝/SporingBoot

스프링부트 권한주기 메뉴제어하기 Kakao Map API 연동하기

Ystory96 2026. 1. 2. 17:58

1. 관리자모드(Admin)와 사용자모드(User) 구분하기

 

  • DB(데이터베이스): 출입 명부에 admin님은 '관리자 등급'이라고 적어두기
  • Spring Security(보안): 로그인할 때 명부를 확인해서 admin님 손에 'ADMIN'이라고 적힌 출입증을 쥐여주기
  • HTML(화면): 문 앞에 서서 "ADMIN 출입증이 있는 분만 이 버튼(관리자 메뉴)을 보여주겠다"라고 검사하는 역할

 

(1) Oracle에서 테이블에 role 추가

 

(2) SecurityConfiguration에서 admin권한 인증 후 해당 페이지로 이동

.formLogin(form -> form
        .loginPage("/login")
        .loginProcessingUrl("/loginProcess")
        .usernameParameter("id")
        .passwordParameter("pw")
        .successHandler((request, response, authentication) -> {

            boolean isAdmin = authentication.getAuthorities()
                    .stream()
                    .anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"));
            //관리자면 admain/item으로 가고, 아니면 /으로 감
             response.sendRedirect(isAdmin? "/admin/item": "/");

 

(3) </admin/item> 관리자만 보이는 페이지 구현

<!DOCTYPE html>

<html xmlns:th="http://www.thymeleaf.org"
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorate="~{layouts/layout}">
<body>
<div layout:fragment="content">

<h1>
    <a th:href="@{/}" >  관리자용 페이지 입니다...<br>
    오직 관리자만 확인 가능합니다></a>

</h1>

</div>
</body>

</html>
 

2. 관리자 모드에서 메뉴 접속 가능

(1) top.html

<ul class="dropdown-menu">
  <li><a href="scoreinput">성적자료입력</a></li>
  <li sec:authorize="isAnonymous() or hasRole('ADMIN')"><a href="scoreout">성적자료출력</a></li>
  <li sec:authorize="isAnonymous() or hasRole('ADMIN')"><a href="hakinwon">학점별인원수구하기</a></li>
  <li><a href="#"></a></li>
</ul>

 

(2) SecurityConfiguration.java

                .requestMatchers("/", "/home", "/login", "/image/**", "/css/**", "/js/**").permitAll()
                .requestMatchers("/memberInput", "/input", "/scoreinput").permitAll() // 입력 페이지
                .requestMatchers("/memberOut", "/memberOut2", "/scoreout", "/out", "/out2").permitAll() // 출력 페이지

                // 2. [실제 데이터 저장/관리] 로직은 권한이 필요함
                // 성적 저장 등은 사용자/관리자 모두 가능
                .requestMatchers("/memInsert", "/scoresave", "/inputsave").hasAnyRole("USER", "ADMIN")
                // 관리자 전용 기능 (관리자 전용 아이템 관리 등)
                .requestMatchers("/admin/**").hasRole("ADMIN")
                // 3. 그 외 모든 요청은 인증 필요
                .anyRequest().authenticated()
)

 

 

 

3. 홈페이지에 카카오맵 넣기

 

 : 아래는 순서대로 캡쳐한 이미지 파일

(1) 카카오 디벨로퍼 접속

https://developers.kakao.com/

 

(2) 앱 만들기

 

(3) 카카오맵 활성화하기

 

(4) 플랫폼에서 새로운 key만들것

 

(5) 만든 key와 구현하는 홈페이지 도메인 넣기

 

(6) 카카오 api 접속

https://apis.map.kakao.com/web/

 

(7) 카카오 </> _ web 으로 들어가기

 

(8) 원하는 지도 형태 코드 복사 

 

(9) Key복사 

 

(10) '발급받은 APP KEY를 사용하세요'에 붙여넣기 

 

(11) 완성~~

 

 

4. 주의할 점

(1) 빌드도구가 Gradle이라는 점

top.html에서 sec:authorize가 작동하지 않을 시 아래 코드 넣기

 

   dependencies {
    // Thymeleaf에서 Spring Security 문법(sec:authorize 등)을 사용하기 위한 확장 라이브러리
    implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'}

 

(2) 권한설정(Role)의 핵심 디테일

 

  • DB 데이터: Oracle 테이블의 role 컬럼에는 반드시 'ROLE_ADMIN', **'ROLE_USER'**처럼 ROLE_ 접두사를 붙여서 저장해야
  • Security 설정: hasRole('ADMIN') 메서드는 내부적으로 ROLE_을 자동으로 체크하기 때문에, DB 데이터와의 매칭이 중요

(3) 카카오맵 구현 시 'localhost' 주의사

  • 플랫폼 도메인: Gradle 프로젝트 실행 시 내장 톰캣 포트(예: http://localhost:1144)가 카카오 디벨로퍼의 **[내 애플리케이션 > 플랫폼 > Web]**에 등록되어 있어야 401 에러 없이 지도가 나타남

 

5. Gemini한테 요약해달 함(개꿀)

 

오늘 학습한 내용을 짧고 명확하게 한 문장씩 정리해 드립니다~

  • 권한 분리 설계: DB의 role 컬럼에 ROLE_ADMIN과 ROLE_USER를 기록하여 관리자와 사용자의 등급을 구분합니다.
  • 경로 분기 처리: 시큐리티의 successHandler를 이용해 로그인 성공 시 관리자는 관리자 페이지로, 일반 사용자는 메인으로 자동 이동시킵니다.
  • 전용 페이지 구현: layout:decorate를 활용하여 오직 관리자 권한(ADMIN)이 있는 사용자만 접근 가능한 전용 상세 페이지를 구축합니다.
  • 의존성 라이브러리: Gradle 환경에서 시큐리티 문법을 사용하기 위해 thymeleaf-extras-springsecurity6 의존성을 추가합니다.
  • UI 접근 제어: 타임리프의 sec:authorize 속성을 사용하여 로그인 전이나 관리자 상태에 따라 상단 메뉴의 노출 여부를 제어합니다.
  • 주소 보안 설정: SecurityConfiguration에서 requestMatchers를 통해 주소별 접근 권한을 명시하여 비정상적인 접근을 차단합니다.
  • 지도 API 연동: 카카오 디벨로퍼스에서 JavaScript 키를 발급받고 도메인을 등록하여 홈페이지 내에 지도를 삽입합니다.
  • 장소 검색 기능: 카카오 맵의 services 라이브러리와 keywordSearch 함수를 활용하여 키워드 기반의 실시간 장소 검색을 구현합니다.

 

끝.