spring boot + react를 사용하는 프로젝트가 막을 내렸다. 그동안 시간이 부족해서 뒤로 미뤄뒀던 대시보드 API 구조개선, 속도개선의 과정을 작성해보도록 한다. 대시보드에 필요한 데이터로는 명언, 사용자의 신체정보 및 감정정보, 최근 7일의 분류별 섭취칼로리, 최근 7/30일, 12개월간 운동시간, 운동 소모칼로리, 수면시간이 있었다. 첫번째 시도 : 일단 무식하게라도 우선 차트에 그릴 걸 생각해서 가장 날짜 테이블을 사용했다. 그렇게해서 만들어진 중구난방 response. 소요되는 시간은 2.8s로 느린것과 별개로 메인페이지이므로 속도개선이 필연적이라고 느꼈다. { "code": 200, "httpStatus": "OK", "message": "조회 성공", "data": { "sleep"..
AOP란? AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 객체지향을 보완하는 수단으로 흩어진 관점(Aspect)를 모듈화 하여 비즈니스 로직을 해치지 않고 재사용 하는 프로그래밍 기법이다. Spring AOP란? Spring AOP는 스프링 프레임워크에서 제공하는 기능 중 하나로 관점 지향 프로그래밍을 지원하는 기술이다. Spring AOP는 로깅, 보안, 트랜잭션관리 등과 같은 공통적인 관심사를 모듈화하여 코드 중복을 줄이고 유지 보수성을 향상하는데 도움을 준다. 핵심 기능의 관점에서 보았을 때, BoardService, UserService, XXXService는 공통된 요소가 없다. 그러나 부가기능 관점에서 바라보면 각각의 Service는 b..
Reflection API 구체적인 클래스 타입을 알지 못해도 메서드, 타입, 변수 등 해당 클래스의 정보에 접근할 수 있게 해주는 자바 API 스프링 프레임워크, 마이바티스, 하이버네이트 등의 라이브러리에서 사용 JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 경우 사용 리플렉션을 사용해 개발자가 등록한 빈을 애플리케이션 내에서 사용할 수 있음 대표 예시 스프링 프레임 워크 : DI에서 사용 MVC : View에서 넘어오는 데이터를 객체에 바인딩 할 때 사용 Hibernate : @Entity 클래스에 setter가 없으면 해당 필드에 값을 바로 주입 JUnit : ReflectionUtils 클래스를 내부적으로 정의하여 사용 주의사항 오버헤드 발생 : 성능 저..
의존성 주입에는 4가지의 방법이 존재한다. 필드 주입(Field Injection) 수정자 주입(Setter Injection) 생성자 주입(Constructor Injection) 일반 메서드 주입(Method Injection) 필드 주입(Field Injection) 필드에 @Autowired를 붙여 바로 주입하는 방법 특징 코드가 간결해진다. 그러나 외부에서 변경이 불가능 하여 테스트하기 어렵다. DI 프레임워크 없이 아무것도 할 수 없다. 애플리케이션의 실제 코드와 상관없는 특정 테스트를 하고싶을 때 사용 정상적으로 작동되게 하려면 결국 setter가 필요 @Autowired(required=false) 옵션 처리를 통해 의존관계가 필수가 아님을 명시할 수 있음 @Service public cl..
스프링에서 어노테이션을 활용한 빈 등록 방법은 크게 2가지가 존재한다 @Configuration + @Bean @Component (@Controller, @Service, @Repository) 오늘은 첫 번째 방법으로 스프링이 어떻게 빈을 등록하고 싱글톤으로 관리하는지 알아본다. @Configuration + @Bean 스프링 컨테이너는 @Configuration이 붙어있는 클래스를 자동으로 빈으로 등록후 해당 클래스를 파싱해서 @Bean이 있는 메서드를 찾아 빈을 생성한다. // 빈으로 등록할 클래스 public class MyBean { public void sayHello() { System.out.println("hi~!"); } } @Configuration public class Confi..
스프링 빈과 의존관계 스프링 빈을 등록하는 2가지 방법 컴포넌트 스캔과 자동 의존관계 설정 우리가 만들었던 MemberController가 MemberService를 통해 가입하고, 데이터를 조회할 수 있어야하는데, 이러한 관계를 MemberController가 MemberService를 의존하는 관계라고한다. 먼저, 아래 코드와 같이 새롭게 객체를 생성해서 사용할 수 있다. @Controller public class MemberController { private final MemberService memberService = new MemberService(); } 그러나 이렇게 객체를 새로 생성한다면, 해당 컨트롤러(멤버 컨트롤러)말고 다른 여러 컨트롤러들이 해당 서비스를 가져다 쓸 수 있다. 고..
함수 스크립트 작성시 유사한 동작을 하는 코드가 여러 곳에서 필요할 때가 있다. 함수를 이용하면 중복 없이 유사한 동작을 하는 코드를 여러 번 호출할 수 있다. 함수 선언(함수 선언문) 함수 선언 방식을 이용하여 함수를 만들 수 있다. function showMsg() { alert('hi'); } // 파라미터가 있는 경우 function name(param1, param2) { // 본문 } 지역 변수 함수 내에서 선언한 변수를 지역 변수(local variable)라 칭하며 지역 변수는 함수 안에서만 접근할 수 있다. function showMsg() { let msg = 'hi'; alert(msg); } showMsg();// hi alert(msg);// error 외부 변수 함수 내부에서는 ..
if와 삼항연산자를 사용한 조건 처리 조건에 따라 다른 행동을 취해야 할 때에는, if문을 사용하거나 조건부 연산자 ?를 사용한다. if문 괄호안의 조건을 평가하여 해당 결과가 true라면 코드를 실행한다. let year = prompt('저는 몇년생일까요?', ''); if (year == 2001) alert('정답입니다.'); // 복수의 문을 실행하고 싶다면 중괄호로 코드블록을 감싼다 if (year == 2001) { alert('정답'); alert('입니다!'); } 코드의 가독성을 위해서는, 실행 구문이 한 줄 이더라도 중괄호를 사용해 감싸는 것을 추천한다. if문은 괄호 안의 표현식을 평가하고, 그 결과를 불린값으로 변환한다. => 0, 빈문자열, null, nudefined, NaN과..
상호작용 alert alert함수는 사용자가 확인 버튼을 누를 때 까지 메시지를 보여주는 창이 계속 떠있는다. 메시지가 있는 작은 창은 모달 창(modal window)이라고 부른다. 사용자는 확인 버튼을 누르기 전 까지 모달 창 바깥에 있는 버튼을 누른다던지 행동을 할 수 없다. alert("Hello"); propmt propmt는 두 개의 인수를 받아 입력필드, 확인 및 취소 버튼이 있는 모달 창을 띄워준다. 사용자가 입력한 필드에 기재한 문자열을 반환한다. 입력 취소의 경우 null을 반환한다. result = prompt(title, [default]); title : 사용자에게 보여줄 문자열 default : 입력 필드의 초깃값 (생략가능) IE환경에서는 두 번째 매개변수가 없는경우 undef..
script 자바스크립트 코드의 양이 많은 경우, 파일로 소분하여 하는것을 추천한다. 절대경로 및 상대경로를 사용하여 지정해줄 수 있다. 그리고 전체 URL을 사용할 수도 있다. 이유로는 브라우저가 스크립트를 다운받아 캐시에 저장하기 때문에, 여러 페이지에서 동일한 스크립트를 사용하는 경우, 캐시로 부터 스크립트를 가져와 사용하므로 트래픽 절약 및 웹페이지의 실제 속도가 빨라지기 때문이다. 코드 구조 문(statement)은 어떤 작업을 수행하는 문법 구조(syntax structure)와 명령어(command)를 의미한다. 이때 서로 다른 문은 세미콜론으로 구분하며, 줄바꿈이 있는경우 아래와 같이 세미콜론이 생략 가능하다. (세미콜론 자동 삽입) alert("안녕") alert("하세요") 그러나 이를..