728x90
반응형

IT 156

스프링 부트에서 비동기로 작업하기

request로 들어온 요청을 처리하는데 시간이 오래 걸리는 작업이 있을 경우 응답을 보내주는 데 수분에서 수십분이 걸린다면 사용자 입장에서는 답답함을 느끼고 서비스를 이용하지 않을 수 있다. 따라서 시간이 오래 걸리는 작업은 우선 응답을 바로 보내주고 시간이 오래 걸리는 작업은 다른 스레드에서 비동기로 처리하고자 한다. 스프링 부트에서는 @Async 어노테이션을 통해 비동기 작업을 처리할 수 있다. @Async를 사용하기에 앞서 설정파일을 만들어줘야 한다. @Configuration @EnableAsync public class AsyncConfig extends AsyncConfigurerSupport { @Override public Executor getAsyncExecutor(){ ThreadP..

스네이크 케이스로 들어온 필드명을 카멜 케이스로 받기

{ "user_mail": "test@mail.com" } 프론트나 웹에서는 주로 스네이크 케이스를 사용하지만 자바에서 변수명은 대개 카멜케이스를 사용한다 스네이크 케이스로 들어오는 변수 이름을 카멜케이스로 받고자 할 때 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) public class SignUpBusinessRequest { private String userEmail; } 이렇게 @JsonNaming 어노테이션을 써소 네이밍전략을 설정해주면 알아서 언더바를 대문자로 변환해서 받아줌 단 dto를 이렇게 설정해놓고 프론트에서 user..

스프링 프로젝트 api에 context path 설정하기 ( /api/v1 )

설정하는 이유 api 경로에 뎁스 하나를 파서 루트를 잡아두면 프론트쪽에서 프록시 처리하기 좋다고 함 모든 컨트롤러에 다 설정해줄 수 없으니 yaml 파일에 설정 appilcation.yaml server: servlet: context-path: /api/v1 yaml이 아닌 properties 사용시 그냥 줄바꿈만 없애고 점찍으면 됨 appplication.properties server.servlet.context-path=/api/v1 그럼 아래같이 부르던 api가 - http://domain:8080/user - http://domain:8080/menu 아래처럼 됨 - http://domain:8080/api/v1/user - http://domain:8080/api/v1/menu

자바 string에서 boolean 변환하기

Boolean. 까지 치니까 getBoolean이란 게 보이길래 아무생각없이 썼는데 얘 아님... parseBoolean 또는 valueOf를 써야 함 Boolean.parseBoolean(str) // 또는 Boolean.valueOf(str) 대소문자는 상관없지만. true가 아니면 모두 false로 나옴 주의 (parseBoolean, valueOf 동일) Boolean.parseBoolean("true") --> true Boolean.parseBoolean("TRUE") --> true Boolean.parseBoolean("TruE") --> true Boolean.parseBoolean("false") --> false Boolean.parseBoolean("asdfd") --> false

SQLAlchemy 같은 테이블에 여러 개의 Foreign key 연결하기

문제상황 class User(db.Model): ... class Store(db.Model): ... # 메인 유저 main_user = db.Column(db.Integer, db.ForeignKey('user.id')) user_main = db.relationship('User', backref=db.backref('store_by_main', uselist=False)) # 서브 유저 sub_user = db.Column(db.Integer, db.ForeignKey('user.id')) user_sub = db.relationship('User', backref=db.backref('store_by_sub', uselist=False)) 그냥 연결하면 Ambiguouse 외래키라고 아래처럼 에..

IT/파이썬 2021.12.13

SQLAlchemy One to One 설정하기 (backref와 back_populates 차이)

원래 양방향 참조를 하려면 부모/자식 엔티티 각각에서 back_populates를 해줘야 함 class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship("Child", back_populates="parent") # on the parent class class Child(Base): __tablename__ = 'child' id = Column(Integer, primary_key=True) parent_id = Column(Integer, ForeignKey('parent.id')) parent = relationship("Parent", back_populates=..

IT/파이썬 2021.12.10

파이썬 현재시각 가져오기 : module 'datetime' has no attribute 'now'

현재 날짜를 가져오려고 datetime을 이용했다 import datetime ... create_time=datetime.now() 그런데 안됨 그런 어트리뷰트 없다고 에러뜸 module 'datetime' has no attribute 'now' 임포트 방법을 수정 from datetime import datetime ... create_time=datetime.now() from datetime을 추가해서 임포트했다 from에서 받는 datetime은 datetime 모듈이고 import에서 받는 datetime은 동명의 모듈의 하위클래스이다. 내가 쓰려고 한 now() 메소드는 datetime.datetime.now()인 것이기 때문에 datetime 하나만 쓰려면 저렇게 명시해줘야 한다...

IT/파이썬 2021.12.08

URL Decoder (퍼센트 인코딩 되돌리기)

%EC%9D%B8%EC%BD%94%EB%94%A9 위처럼 %d하나와 숫자 두개씩 나타나는 포맷이 url 인코딩된 형태임 퍼센트 인코딩이라고도 하는 듯 숫자나 영어는 건드리지 않고 한글만 바꿈 인코딩decode333 -> %EC%9D%B8%EC%BD%94%EB%94%A9decode333 간단하게는 아래 사이트에서 돌려볼 수 있음 https://meyerweb.com/eric/tools/dencoder/ 자바에서는 URLDecoder를 써서 바꾸면 됨 String getOriginString = URLDecoder.decode(encodedString, "UTF-8"); 이때 URLDecoder.decode(...) 와 같이 decode에 취소선이 그어지면서 deprecated 됐다고 나오면 뒤에 "UTF-..

영상 인코딩 (코덱 종류, i-prame과 p-frame 등)

코덱 - codec = COmpressor + DECompressor - 멀티미디어 데이터를 압축하거나 푸는 소프트웨어 - 압축된 데이터는 코덱에 따라 고유한 확장자 가짐 H.264, H.265 - MPEG과 ITU가 연합해서 만든 동영상 압축 표준 - 시간이 오래 걸리지만 압축률과 화질이 좋음 VP8, VP9 - 구글이 개발한오픈소스 코덱 (H.264는 라이센스 비용 발생) - 그래픽카드가 지원을 안해주면 개발자가 일일이 만져줘야 해서 어렵다고 (vp9) 프레임 - I-frame : 스트리밍할때 원본 이미지 (키프레임) - P-frame : 아이프레임과 비교해서 변화가 있는 부분만 데이터 전달 (단방향 참조) - B-frame : 아이프레임, 피프레임 양방향으로 참조 이미지 전환이 많은 영상이면 아이프..

IT 2021.11.24

데이터 검증을 스프링에서 하지 않고 db로 넘겨주기

DeviceServiceImp.java // 빈 채널을 찾아서 기기 등록 (빈 채널이 없으면 익셉션) List channelList = channelRepository.findAllByStoreId(store.getId()); Boolean fullDevice = true; for(Channel channel : channelList){ if(channel.getDevice()==null){ channel.setDevice(device); channelRepository.save(channel); fullDevice = false; break; } } if(fullDevice){ throw new FullDeviceException(); } 위처럼 구구절절 포문 돌려서 하던 로직을 db로 넘겨주기 ↓↓↓..

300x250
반응형