• 티스토리 홈
  • 프로필사진
    imaginaring
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
imaginaring
  • 프로필사진
    imaginaring
    • 분류 전체보기 (66)
      • 프로그래밍 (30)
        • 알고리즘 자료구조 (0)
        • 문제풀이 (0)
        • 기록 (3)
        • Java (4)
        • 스프링, JPA, MyBatis (11)
        • JS, 리액트 등 웹 프론트 (11)
        • 파이썬 (1)
      • DB (1)
        • MySQL (1)
      • 네트워크 (6)
        • AWS (2)
        • NCP (0)
        • 클라우드 공통 (2)
        • 네트워크 (2)
      • OS (9)
        • 리눅스 (8)
        • 윈도우 (1)
      • 게임엔진 (4)
        • 유니티 (0)
        • 언리얼 (4)
        • 그래픽스 (0)
      • 프로젝트 관리 (0)
        • Git & SVN (0)
      • 사이드 프로젝트 (0)
        • 외주 (0)
        • 아이디어 (0)
        • 기록 (0)
      • 프로젝트 (0)
      • 자격증 (15)
        • 리눅스마스터 (14)
        • SQLD (1)
        • 정보처리기사 (0)
        • 네트워크관리사 (0)
        • CCNA (0)
        • AWS SAA (0)
        • NCP (0)
      • 생활수학 (0)
      • 일상 (1)
        • 여행 (0)
        • 바이크 (0)
        • 기타 (1)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • @ Annotation 어노테이션
        2024년 12월 24일
        • imaginaring
        • 작성자
        • 2024.12.24.:50

        목적

        • 메타데이터 제공 - 부가정보를 제공하여 런타임 또는 컴파일러가 처리할 수 있도록
          • @Override, @Deprecated
        • 컴파일러 지시 - 컴파일러가 특정 경고롤 무시하거나, 잘못된 사용을 체크하도록
          • @SuppressWarnings
        • 런타임 동작 변경
          • 프레임워크나 라이브러리가 런타임에 동적으로 동작 변경가능
            • @Controller, JPA에서 @Entity
        • 가독성 향상, 너무 많으면 반대로 복잡해지고 가독성이 떨어질수도...
        • 메타데이터 의존 - 런타임 동작 이해하려면 어노테이션과 이를 처리하는 프레임 워크 동작 원리를 알아야함

         

        자바 내장 어노테이션

        • @Override
        • @Deprecated - 해당 코드가 더 이상 사용되지 않음 (사용시 컴파일러 경고 발생)
        • @SuppresssWarnings - 컴파일러가 경고를 무시하도록 지시

         

        커스텀 어노테이션 - 직접 어노테이션 정의하는 예시

        import java.lang.annotation.ElementType;
        import java.lang.annotation.Retention;
        import java.lang.annotation.RetentionPolicy;
        import java.lang.annotation.Target;
        
        // @Target: 어노테이션을 적용할 수 있는 위치 지정
        // ElementType.METHOD 메소드에만 적용가능
        @Target(ElementType.METHOD)
        
        // @Retention: 어노테이션의 유지 정책 지정
        // RUNTIME : 런타임까지 유지 (리플렉션으로 접근 가능)
        // CLASS : 컴파일된 클래스 파일에 유지되지만 런타임에 접근 불가
        // SOURCE : 소스 코드에만 유지, 컴파일 후 제거
        @Retention(RetentionPolicy.RUNTIME)
        public @interface MyAnnotation {
            String value() default "Default Value";
        }
        // 사용
        public class MyClass {
            @MyAnnotation(value = "Hello, Annotation!")
            public void myMethod() {
                System.out.println("Method is running.");
            }
        }

         

        리플렉션으로 어노테이션 읽기

        import java.lang.reflect.Method;
        
        public class AnnotationProcessor {
            public static void main(String[] args) throws Exception {
                Method method = MyClass.class.getMethod("myMethod");
        
                if (method.isAnnotationPresent(MyAnnotation.class)) {
                    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
                    System.out.println("Value: " + annotation.value());
                }
            }
        }

         

         

        Spring 주요 어노테이션

         

        • @Component: 일반적인 Bean 등록.
        • @Service: 비즈니스 로직을 수행하는 Bean 등록.
        • @Repository: 데이터 접근 계층(DAO) 등록.
        • @Controller: MVC의 컨트롤러로 등록.
        • @Autowired: 의존성 주입(DI)을 자동으로 수행.
        • @RestController : REST API 컨트롤러 정의, JSON / XML 형식 데이터 반환
        @RestController
        public class MyRestController {
            @GetMapping("/api/data")
            public String getData() {
                return "Hello, World!";
            }
        }
        • 요청처리 및 매핑
          •  @RequestMapping : HTTP 요청을 특정 메소드 또는 클래스와 매핑
          • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
        // 1
        @RestController
        @RequestMapping("/api")
        public class ApiController {
            @RequestMapping("/data")
            public String getData() {
                return "Mapped using @RequestMapping";
            }
        }
        
        // 2
        @RestController
        public class ApiController {
            @GetMapping("/data")
            public String getData() {
                return "GET Data";
            }
        
            @PostMapping("/data")
            public String createData() {
                return "POST Data";
            }
        }
        • 스프링부트
          • @SpringBootApplication: 스프링부트 엔트리포인트 정의
            • @Configuration : 설정 클래스 (Bean 등록 등)
            • @EnableAutoConfiguration : 스프링 부트 자동 설정 활성화
            • @ComponentScan : 지정된 패키지와 하위 패키지를 스캔하여 Bean으로 등록
            • @PropertySource : 외부 프로퍼티 파일 로드
            • @Value : 프로퍼티 파일 값을 주입받음
        @Configuration
        public class AppConfig {
            @Bean
            public MyService myService() {
                return new MyService();
            }
        }
        
        
        @Configuration
        @PropertySource("classpath:application.properties")
        public class AppConfig {
        }
        
        @Service
        public class MyService {
            public String getService() {
                return "Service Logic";
            }
        }
        
        @Controller
        public class MyController {
            @Autowired
            private MyService myService;
        
            @GetMapping("/hello")
            public String hello() {
                return myService.getService();
            }
        }
        
        @Component
        public class AppProperties {
            @Value("${app.name}")
            private String appName;
        
            public String getAppName() {
                return appName;
            }
        }

         

        데이터 및 트랜잭션 관련 어노테이션

        • @Entity : JPA에서 데이터베이스 테이블과 매핑되는 클래스
        @Entity
        public class MyEntity {
            @Id
            @GeneratedValue(strategy = GenerationType.IDENTITY)
            private Long id;
        
            private String name;
        }
        • @Transactional : 메소드 또는 클래스에 트랜잭션 관리 기능 적용
        @Service
        public class MyService {
            @Transactional
            public void performTransaction() {
                // 트랜잭션 관리
            }
        }

         

        테스트 관련 어노테이션

        • @SpringBootTest : 통합 테스트를 위한 어노테이션, 스프링 컨텍스트를 로드하여 테스트 실행
        @SpringBootTest
        public class ApplicationTests {
            @Test
            void contextLoads() {
            }
        }
        • @MockBean : 테스트 환경에서 Bean을 Mock 객체로 대체
        @SpringBootTest
        public class ServiceTest {
            @MockBean
            private MyRepository repository;
        }

         

         

        어노테이션 설명
        @SpringBootApplication 스프링 부트 애플리케이션의 진입점
        @Component 일반적인 Bean 등록
        @Service 비즈니스 로직을 수행하는 클래스
        @Repository 데이터베이스 작업을 처리하는 DAO 클래스
        @Controller MVC 컨트롤러
        @RestController REST API 컨트롤러
        @Configuration 설정 클래스
        @Entity JPA 엔터티 클래스
        @Transactional 트랜잭션 관리
        @SpringBootTest 통합 테스트

        '프로그래밍 > 스프링, JPA, MyBatis' 카테고리의 다른 글

        스프링 MVC  (2) 2024.12.26
        Bean 스코프  (1) 2024.12.26
        Mock  (0) 2024.12.24
        AOP 관계지향  (0) 2024.12.24
        스프링 프레임워크  (2) 2024.12.24
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바